花生米(四)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
五一长假第四天,Tom逛了N个bbs,做了N^2个脑筋急转弯题,终于发现了每次吃完花生米嘴里都是苦味的原因:自己总会吃到最后一粒花生米。
五一长假第五天,Tom和Jerry在仓库散步的时候发现了n堆花生米(这是什么仓库啊?!)。这次Tom制定分花生米规则如下:
1、首先选出最苦的一粒花生米,放到一个瓶子里;
2、Tom和Jerry轮流从任意一堆花生米中取出任意粒吃掉;
3、如果Tom吃到最后一粒花生米(瓶子里的花生米除外),Jerry必须吃掉瓶子里的花生米;如果Jerry吃到最后一粒花生米(瓶子里的花生米除外),Tom自愿吃掉瓶子里的花生米;
4、为显示规则的公平性,Jerry可以选择先取或者后取。
Jerry当然希望瓶子里的花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。
输入:
本题有多个测例。
每个测例的输入第一行是一个整数n,n大于零小于等于10,代表花生米的堆数(取出最苦花生米后);接下来n行每行一个不超过100的正整数,分别代表一堆花生米的粒数(取出最苦花生米后)。
n等于0表示输入结束,不需要处理。
输出:
每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。
输入样例:
2
1
1
2
1
100
0
输出样例:
0
1
#include<stdio.h> int num[10]={0};//每堆花生米数量 int n;//(0~10) int search()//直接根据n的只判断Jerry取的先后次序(算法中没有循环) { int count=0; if(n==1) return 1;//只有一堆花生米,Jerry取走该堆数量-1即可赢 else { for(int i=0;i<n;i++) if(num[i]==1)//统计单粒堆的堆数 count++; if(count==n)//n堆花生米,都是单粒堆 { if(n%2==0)//由于n取0~10,与花生米(二)的前10粒算法相同 return 0; else return 1; } else//至少有一堆不是单粒堆 { if(n==2)//只有2堆花生米 { //若Jerry取完后两堆只剩下(1,1)(2,2)....(k,k),则Jerry必赢 //因为只要之后每次Tom取之后,Jerry取与Tom相同的数量就必赢 if(num[0]==num[1]) return 0; else return 1; } else//多于2堆花生米 { int L1,L2;//标记单粒堆和多粒堆数量的奇偶 if(count>0 &&count%2==0)//(有单粒堆)单粒堆的数量为偶数(注意都不大于10) L1=0; //让对方先取,Jerry能取道最后一粒 else L1=1; if((n-count)%2==0)//多粒堆的数量为偶数 L2=0; else L2=1; //////////////////////////////////////?????? if(L1==1 &&L2==1)//单粒堆数量和多粒堆数量均为奇数 return 1; else return 0;//单粒堆数量和多粒堆数量中有偶数,则让对方取数成(单粒堆数量和多粒堆数量)均奇, //在对方取数成均奇之前Jerry则一直取数保持(单粒堆数量和多粒堆数量)非均奇 ////////////////////////////////////// } } } } int main() { scanf("%d",&n);//输入花生米堆数(0~10之间) while(n) { for(int i=0;i<n;i++) scanf("%d",&num[i]);//每堆花生米的数量num[i](0~100之间)(除去苦的那粒花生米 ) int temp=search(); printf("%d\n",temp); scanf("%d",&n);//下一轮测试 } return 0; }