Codeforces1161C Thanos Nim 博弈论

题意

n n n堆石子,其中 n n n为偶数。两个人轮流操作,每次可以选择 n 2 \frac{n}{2} 2n堆石子,并在每堆石子中取走数量不为 0 0 0的石子(可以不相同),不能操作者输。问先手必胜还是后手必胜。
n ≤ 50 , 每 堆 石 子 数 ≤ 50 n\le50,每堆石子数\le 50 n50,50

分析

这题不难但是挺有意思。
n n n堆石子中数量最少的石子数为 m n mn mn
若石子数恰为 m n mn mn的石子堆数大于 n 2 \frac{n}{2} 2n,则无论先手如何选择, m n mn mn的值必然会减小,设 m n mn mn的值变为 m n ′ mn' mn,则操作完后石子数为 m n ′ mn' mn的堆数不大于 n 2 \frac{n}{2} 2n
否则的话,先手可以通过对 n 2 \frac{n}{2} 2n堆石子数大于 m n mn mn的石子堆操作,在不改变 m n mn mn的情况下使得石子数恰为 m n mn mn的石子堆数变为大于 n 2 \frac{n}{2} 2n
若某一轮先手取完了某一堆石子,显然后手必胜。
故只要判断石子数为 m n mn mn的堆数是否大于 n 2 \frac{n}{2} 2n即可。

代码


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

const int N=55;
const int inf=1e9;

int n,a[N];

int main()
{
	scanf("%d",&n);
	int mn=inf;
	for (int i=1;i<=n;i++) scanf("%d",&a[i]),mn=std::min(mn,a[i]);
	int cnt=0;
	for (int i=1;i<=n;i++) if (a[i]==mn) cnt++;
	if (cnt<=n/2) puts("Alice");
	else puts("Bob");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值