[NC189C]硬币游戏

题目大意:有$4n$个硬币,放在$2n$个位置(即放成两排),有两个人,轮流取。第一个人取上面的,第二个人取下面的,每个人只可以取两个人都没取过的位置。若硬币正面向上,为$1$,反面为$0$。把取得的硬币按取得顺序排成一列,这个二进制数大的人赢,为有没有先手必胜策略。

题解:贪心,一定是先取正面向上的,如果有两个都是正面朝上的就取,不然去自己的一边是正面向上的,再不然就取自己的反面向上而对方正面向上的(让对方没法取)

卡点:字符串循环时写成了$1\sim len$(应该为$0\sim len - 1$)

C++ Code:

#include <cstdio>
int n;
char s[2000010], p[2000010];
int ans[5];
int he[2];
int main() {
	scanf("%d", &n);
	scanf("%s%s", s, p);
	for (int i = 0; i < n * 2; i++) {
		if (s[i] == 'U') {
			if (p[i] == 'U') ans[3]++;
			else ans[2]++;
		} else {
			if (p[i] == 'U') ans[1]++;
			else ans[0]++;
		}
	}
	int now = 1;
	for (int i = 1; i <= n * 2; i++) {
		if (ans[3]) he[now]++, ans[3]--;
		else if (ans[1 << now]) he[now]++, ans[1 << now]--;
		else if (ans[3 - (1 << now)]) ans[3 - (1 << now)]--;
		else ans[0]--;
		now ^= 1;
	}
	if (he[1] > he[0]) puts("clccle trl!");
	else puts(he[1] < he[0] ? "sarlendy tql!" : "orz sarlendy!"); 
	return 0;
}

 

转载于:https://www.cnblogs.com/Memory-of-winter/p/9639307.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值