考虑到绝大多数 codeforces 题目在 luogu 上都有翻译,这个列表不会经常更新
https://codeforces.com/problemset/problem/1669/D
初始一个全是W的字符串
每次操作可以选相邻两个位置,一个改成R,一个改成B
(选过的位置可以重复选)
(不能只选一个,必须是选相邻的2个位置)
(这两个位置可以改成BR也可以改成RB)
问最终结果是否可能是输入的字符串?
按W把字符串分成若干个非空段,如果每一段都有R且有B,那么就是YES
否则就是NO
https://codeforces.com/problemset/problem/1669/E
输入n个长度为2的字符串
输出有多少对(s[i],s[j])
字符串恰好差一个字符
s和t恰好差一个字符 的意思是 (s[0],t[0]) (s[1],t[1])两组位置,一组一样,另一组不一样
比如 AB 和 BC 不算差一个字符,因为两组位置都不一样
对是无序对,要求i<j
方法一:
对于每个种字符串,统计个数,一共至多有676种字符串
枚举676种字符串之间,哪些对字符串,恰好差一个字符
方法二:
每次读入一个新字符串s之后
答案 += 以s[0]开始的字符串个数 + 以s[1]结束的字符串个数 - 2 * 字符串s出现的次数
https://codeforces.com/problemset/problem/1660/B
多组数据
每组数据输入一个长度为n的数组
每次从数组中选一个最大值自减1
直到数组中所有数字变为0
不希望有一个数字连续两次减少1
问能不能做到,如果可以输出Yes,如果做不到输出No
https://codeforces.com/contest/1660/submission/151534158
特别注意n=1
的情况,需要单独判断a[0]
是不是1
https://codeforces.com/contest/1656/problem/A
输入一个数组,找到两个下标(i,j)
,使得对于所有的k
都满足
abs(a[i] - a[k]) + abs(a[k] - a[j]) == abs(a[i] - a[j])
i是最大值的位置
j是最小值的位置
https://codeforces.com/contest/1656/submission/150990878
https://codeforces.com/contest/1656/problem/B
输入一个数组a
每次从中选择一个数字x
,删去这个数字,其他数字都a[i]-=x
问操作n-1
次之后,能不能恰好剩下k
如果可以,最后剩下的两个数字之差是k,这两个数字从开始的差就是k
相当于询问数组中是否有两个数字之差是k
https://codeforces.com/contest/1656/submission/150990342
https://codeforces.com/contest/1656/problem/C
输入一个数组a
,每次可以选一个数字x(x>=2)
,所有数字a[i]%=x
问能不能让所有数字都一样
如果输入的数字没有1,每次把最大的数字操作成0就可以了
如果输入的数字有1, 1是不会变的,每次把最大的数字操作成1就可以了
所以要求不能有相差为1的数字对
https://codeforces.com/contest/1656/submission/150989509
https://codeforces.com/contest/1656/problem/D
输入 n 找 k(k>=2)
使得存在 k 个正整数,模 k 之后余数互不相同,并且这 k 个正整数的和是 n
相当于找k,使得 (n - k*(k+1)/2) % k == 0
如果k是奇数
那么 n % k == 0 && n >= k * (k + 1) / 2
满足k是奇数,且n%k==0的一个可行解是,n除以若干次2之后得到的结果
如果k是偶数
那么 n % (k/2) == 0 && n / (k/2) % 2 == 1 && n >= k * (k + 1) / 2
满足k是偶数,且n % (k/2) == 0 && n / (k/2) % 2 == 1,那么k一定是2的次幂
这两个解中,一定有一个k满足 n >= k * (k + 1) / 2
如果n是奇数 k=2
如果n是2的倍数 但不是4的倍数 k=4
如果n是4的倍数 但不是8的倍数 k=8
#include <bits/stdc++.h> using namespace std; int t; long long n; int main() { cin >> t; for (int tt = 0; tt < t; tt++) { cin >> n; long long x = n & -n; if (x == n) { cout << -1 << endl; } else { // k = n / x; // k = 2 * x; // 较小的一定满足 k*(k+1)/2 <= n cout << min(n / x, 2 * x) << endl; } } return 0; }