codeforces做题记录:
这个系列将是我在codeforces上遇到的好题分享。
在刷codeforces的过程中遇到的有趣的题目,我都会尽量写在这个专栏的,希望大家可以订阅我这个专栏。
今天分享的是Codeforces Round #770 (Div. 2)的B题
简单翻译意思:
输入正整数n,表示数组的大小,再输入正整数x,表示初始值,再输入正整数y,表示需要经过变换得到的值。接下来一行输入n个数字,表示数组的n个具体值。
对于这n个数字中的每一个,从第一个到最后一个依次使用x对其进行两种操作中的任意一种:
- x = x + a[ i ];
- x = x ^ a[ i ];
Alice的初始值为x,Bob的初始值为x + 3
题目保证要么Alice可以得到y,要么Bob可以得到y,不会出现两个人都无法得到的情况
如果以x为初始值,n个数字操作完后,可以得到y,就输出Alice,否则,输出Bob
思路:
这里直接介绍最简单的方法了
我们可以思考,加法操作和异或操作的共同点是什么?
奇数 + 奇数 | 偶数 |
---|---|
奇数 ^ 奇数 | 偶数 |
奇数 + 偶数 | 奇数 |
奇数 ^ 偶数 | 奇数 |
从上面简单给出的几个例子,可以看出,一个数字对另一个数字的加法运算或者异或运算在奇偶层次上是相同的。
也就是说,计算n次后,无论中间某次作了什么运算,最后结果的奇偶是确定的,又因为Alice和Bob的初始值的奇偶性是相反的。
所以只需要保证最后的结果和所要得到的y的奇偶性相同,即可保证一定可以得到。
这样,我们就可以很轻易解决问题了,不需要考虑中间的计算步骤。
c++参考代码:
#include"bits/stdc++.h"
using namespace std;
void solve(){
long long int n,x,y;
cin >> n >> x >> y;
long long int number;
long temp = x & 1;
while(n--){
cin >> number;
temp += number & 1;
}
if ((temp & 1) == (y & 1)){
cout << "Alice" << endl;
} else {
cout << "Bob" << endl;
}
}
int main(){
int n;
cin >> n;
while(n--){
solve();
}
return 0;
}
我的翻译可能读起来不太流畅,也没有把题目的输入完全表述出来,只是表述了其中最关键的部分,如果想看原题的话建议点击上面的网址。
觉得我写的还行的话,给个赞吧~~