Codeforces Round #717 (Div. 2)
题意:
n个数,可以最多执行k次操作,每次操作可以使任意一个数加一,另外一个数减一,问最多执行k次操作后可以得到字典序最小的序列是多少
思路:
由于字典序最小,所以每次就使第一个非0的数减一,最后一个数加一,若当前第一个非0的数就是最后一个数,即前面的数都减为0了,此时结束循环,得到的序列就是答案序列
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int t; cin >> t; while (t--) { int n, k; cin >> n >> k; int a[110]; memset(a, 0, sizeof a); for (int i = 0; i < n; i++) cin >> a[i]; int e = 0; while (k--) { while (a[e] == 0 && e < n - 1) e++;//注意不是if,并且e不能是最后一个数 a[e] --; a[n - 1] ++; /*bool flag = true; for (int i = 0; i < n - 1; i++) if (a[i]) { flag = false; break; } if (k == 0) break; else if (flag) break; else if (e == n - 1) break;*/ } for (int i = 0; i < n; i++) cout << a[i] << " "; cout << endl; } return 0; }
题意:
给你一个长度为n的序列进行异或运算使得序列序变为长度>=2的只有相同元素的序列。问你是否可能
思路:
我们如果将n个数全部异或和操作,最后的结果跟进行的顺序无关,最终只会有两种结果,要么是0,要么是x。
为什么呢?
如果我们可以进行几步异或和操作,使最后的几个数相等的话。
如果我们这些相等的数继续异或和,如果有偶数个数,因为所有数相等,所以最终结果肯定为0.
如果有奇数个数相等,那最终的结果肯定就是这个数。
所以我们就对这n个数进行异或和,来看最后的值的结果。
如果是0的话,说明肯定有偶数个相等的数异或和,直接输出YES。
如果是一个数x,那这n个数经过几步操作最终如果想让所有数相等,那相等的那个数肯定是x。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 typedef long long LL; 8 9 LL a[1000010]; 10 11 int main() 12 { 13 int t; 14 cin >> t; 15 while (t--) 16 { 17 int n; 18 cin >> n; 19 LL res1 = 0; 20 for (int i = 0; i < n; i++) cin >> a[i], res1 ^= a[i]; 21 22 if (res1 == 0)//偶数个相等的数的情况 23 { 24 puts("YES"); 25 continue; 26 } 27 //奇数个相等的数的情况,最后的数res = x 28 LL cnt = 0, res2 = 0; 29 for (int i = 0; i < n; i++) 30 { 31 res2 ^= a[i]; 32 if (res2 == res1)//有一个x 33 { 34 res2 = 0; 35 cnt++; 36 } 37 } 38 39 if (cnt >= 3) puts("YES"); 40 else puts("NO"); 41 } 42 43 return 0; 44 }

浙公网安备 33010602011771号