poj1740 A New Stone Game

     题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。

真是好♂题,代码不长就是好♂题。

     首先考虑两堆相同的石子,先手一定必输,因为若是我操作第一堆,则后手也可以对第二堆做对称决策。

其实,其他情况,一定是先手必胜。

第一种情况:奇数堆。

    我们可以将最大堆的石子分配给其他堆让他们两两配对,如下图所示:

显然,红色部分绝壁不会超过第五个 石子的高度。

 

第二种情况:偶数情况

我们可以把最大堆和最小堆先配对,剩余的那段照样拿来和n-2堆石子配用。

呆玛:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 int n,f[205],x;
 8 int main(){
 9     while (scanf("%d",&n)&&n){
10         int cnt=0;
11         memset(f,0,sizeof f);
12         for (int i=1;i<=n;i++){
13             scanf("%d",&x);
14             if (!f[x]) cnt++,f[x]=1;
15             else cnt--,f[x]=0;
16         }
17         if (!cnt) printf("0\n");
18         else printf("1\n");
19     }
20 }

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5266761.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值