Codeforces Round #207 (Div. 1)(A,B,C)
code:https://github.com/9974/Codeforces/tree/master/207div1
A
线段树,并查集,set恶搞都可以。我保存了set恶搞的代码
B
两个串的长度为l1,l2,令d = gcd(l1,l2); 把串x,y以长度d做分割。 假设 l1=18, l2=27, d = 9
l1 分为2块, l2 分为3块 在长度为lcm(l1,l2)的情况下可以发现 l1 的 任何一块都会跟l2的任何一块匹配,
例如 l1的i位会和l2 的 i%d,i%d+d,i%d+2*d......i%d+k*d匹配。而且总长度一定是lcm(l1,l2)的倍数,之后乘以这个倍数即可。
C
先判断是否有解 。假设最后3剩余x个,4剩余y个 那么只要满足 3*x+4*y == sum && x+y <= n
枚举其中一个未知数然后判断另一个即可。
假如同时有 1 2 那么 把1放到2上面去一定是最优的。
最后考虑1有剩余和2有剩余的情况
1.最后假如1有剩余, 如果1的个数超过三个那么一定是拿3个1是最优的。
如果1有2个一定操作2次。
如果1有1个,如果当前有3, 把1给3, 操作1次
如果没有3, 那么一定是从2个4拿分别拿1个给1, 操作2次
2.最后假如2有剩余, 如果1的个数超过三个那么一定是拿3个2是最优的。
如果2有2个,一定操作2次。
如果2有1个,如果当前有4, 把4拿下1个给2, 操作1次
如果没有4, 那么一定是把2分给2个3,操作2次