传送门:https://atcoder.jp/contests/abc192
A:
题意:现在有X枚硬币,要使硬币数为100的倍数还需要多少枚硬币(如果X已经为100的倍数不算)。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
B:
题意:给定一个字符串,若奇数位上为小写字母,偶数位上为大写字母,输出Yes;否则输出No。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
C:
题意:设g1(x)为x降序重组得到的数,g2(x)为x升序重组得到的数,f(x)=g1(x)-g2(x),给出N和K,求aK,其中a0=N,ai+1=f(ai)。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
D:
题意:给定一串数字X和一个整数M,设d为X最大的数字,选择一个不小于d+1的整数n,将X看成n进制数,可以得到多少个不大于M的不同整数。
分析:首先特判一下,若X的位数为1,那无论进制是多少结果都是X,判断是否大于M即可;否则在不同进制下X必不相等,此时求出满足条件的最大的n,减去d即可。很容易想到用二分法。在判断的时候注意溢出。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
E:
题意:给定N个城市和M条道路,每条道路i到目的地需要的时间为Ti,发车的时间为Ki的倍数(包括0),求从X到Y城市需要的最短时间。
分析:设在当前城市已用时为t,可以知道此时从当前城市到其他城市的用时cost=t+Ki-d%Ki(若d%Ki==0,cost-=Ki),跑一边dijkstra即可。(注意pair里面的是long long)
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
F:
题意:给定N个数和需要得到的数X,选取k个数合并后这个数每次会增加k,求最少需要增加多少次,使得恰好得到X。
分析:问题转化为,当选取k个数时求最大的合并数max,使得(X-max)%k等于0(也就是说max和X同余),因此设dp[i][j][k]表示从前面i个数中选取k个数,使得合并数在模k后的余数为j的情况下的最大数,假设目前枚举到的选取个数为k,那么转移方程为:
(1):dp[i+1][j][l]=max(dp[i+1][j][l],dp[i][j][l]);
(2):dp[i+1][(j+mod)%k][l+1]=max(dp[i+1][(j+mod)%k][l+1],dp[i][j][l]+a[i])
最终结果为min((x-dp[n][X%k][k])/k,1<=k<=n)
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include