codeforces做题记录(脑筋急转弯的B题)

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

我的翻译可能读起来不太流畅,也没有把题目的输入完全表述出来,只是表述了其中最关键的部分,如果想看原题的话建议点击上面的网址。

觉得我写的还行的话,给个赞吧~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值