Codeforces Round #717 (Div. 2)

A. Tit for Tat

题意:

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;
}

B. AGAGA XOOORRR

题意:

给你一个长度为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 }

 

posted @ 2021-04-22 16:39  彦辰kkkkk  阅读(128)  评论(0)    收藏  举报