2018.8.29 练习赛

T1 病毒分裂

很显然它是要我们求\(k^{0}+k^{1}+k^{2}+……+k^{n-2}\)的和,但如果直接暴力算,看范围就知道肯定爆炸= =
于是我们对除去了\(k^{0}\)的部分进行二分就行了,递归实现。但是要注意\(long long\),以及特判\(N==2\),否则会卡掉……好像可以用等比数列求和做,看有没有dalao讲讲……

T1 疫情延迟

这道题想要想到解法还是比较容易的;求最小破坏程度,同时我们注意到最小破坏程度是具有单调性的,满足二分答案的条件。有一点要注意,当我们二分出一个值\(key\)时,所有满足\((x<=key)\)的边都可以被删除。然后愉快的\(spfa\)就行了。\((ps:还是要注意long long)\)

T3 最短路径

从数据范围来看可以想到是\(DP\),如果我们考虑来回走的话会很恶心,于是我们可以把问题转化为等价的:两遍都从\(A\)出发到\(B\),求不相交的最短路径。
DP状态:\(f[i][j]\)表示表示\(1\)\(i\)\(j\)的最小值。
转移及需特判点见code:

if(i!=j||i==1) {
                if(max(i,j)==n) {
                    if(j==n) f[n][n]=min(f[n][n],f[i][j]+dis(i,n));
                    if(i==n) f[n][n]=min(f[n][n],f[i][j]+dis(j,n));
                    continue;
                }
                if(max(i,j)+1!=b1) f[i][max(i,j)+1]=min(f[i][max(i,j)+1],f[i][j]+dis(j,max(i,j)+1));
                if(max(i,j)+1!=b2) f[max(i,j)+1][j]=min(f[max(i,j)+1][j],f[i][j]+dis(i,max(i,j)+1));
            }
posted @ 2018-08-29 17:58  Katoumegumi  阅读(80)  评论(0编辑  收藏  举报
返回顶部