• 花生米(四)


    时限: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;
    }
  • 相关阅读:
    @atcoder
    @loj
    @atcoder
    @gym
    @codeforces
    @atcoder
    @bzoj
    @loj
    Kafka常用命令
    Kafka入门介绍
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2594202.html
Copyright © 2020-2023  润新知