第五届在线编程大赛月赛第三题:石子游戏(1)

题目详情

甲乙两人面对若干堆石子,其中每一堆石子的数目可以任意确定。

两人轮流按下列规则取走一些石子,游戏的规则如下:

1.每一步应取走至少一枚石子;

2.每一步只能从某一堆中取走部分或全部石子;

3.如果谁无法按规则取子,谁就是输家。

如果甲乙两人都采取最优的策略,甲先拿,请问,是甲必胜还是乙必胜.

输入格式:

多组数据,每组数据两行,第一行是一个整数N, 2<=N<=10000

下一行是N个正整数,代表每堆的石子数,石子数在32位整数内。

输出格式:

每组测试数据输出一行,如果甲存在必胜策略,输出"Win",否则输出"Lost"

答题说明

输入样例

3

3 3 1

输出样例:

Win

 
 
 
第一种方法主要是找规律:
#include<stdio.h>
int  shiziyouxi(int a[],int n);
int  main()
{
  int  i,a[10000],n;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    scanf("%d",&a[i]);
  }
  shiziyouxi(a,n);
  return   0;	
}
int  shiziyouxi(int a[],int n)
{
	int  num_all=0;
	int  num_1=0;
	int  i;
	for(i=1;i<=n;i++)
	{
		num_all++;
	  if(a[i]!=1)
	{
		num_1++;		
	}
	}
	if(n%2==0&&num_1%2==0)
    {
    	 printf("Lost");
    }	
	
	 else
	 {
	   printf("Win");
	 }
}
第二种方法主要用了
Enockipp   的代码详见:
#include<iostream>
int main(int argc,char**argv){  
    int N=0;  
  while(std::cin>>N){  
         int ret=0;  
         int temp=0;  
        for(int i=0;i<N;++i){  
           std:: cin>>temp;  
            ret^=temp;  
       }  
        if(ret!=0)  
           std:: cout<<"Win"<<std::endl;  
         else  
          std:: cout<<"Lost"<<std::endl;         
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值