花生米(二)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
五一长假第二天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(这个仓库还真奇怪)。这次Tom制定分花生米规则如下:
1、Tom和Jerry轮流从堆中取出k粒花生米吃掉,k可以是1,5,10中的任意一个数字;
2、为显示规则的公平性,Jerry可以选择先取或者后取。
Jerry当然还是希望最后一粒花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。
输入:
本题有多个测例,每个测例的输入是一个整数n,n大于零小于等于1000,代表花生米的数量。
n等于0表示输入结束,不需要处理。
输出:
每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。
输入样例:
1
2
3
4
0
输出样例:
0
1
0
1
code:
#include <iostream>
using namespace std;
int status[1010];
void Search()
{
for(int i = 1; i < 10; i++)
{
if(i % 2 == 0)
status[i] = 1;
else
status[i] = 0;
}
status[10] = 1;
for(int i = 11; i <= 1000; i++)
{
if(status[i-1] == 1 && status[i-5] == 1 && status[i-10] == 1)
status[i] = 0;
else
status[i] = 1;
}
}
int main()
{
Search();
int n;
while(cin >> n , n)
cout << status[n] << endl;
}
花生米(三)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
五一长假第三天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(仓库,又见仓库……)。这次Tom制定分花生米规则如下:
???????1、Tom和Jerry轮流从堆中取出k粒花生米吃掉;
2、第一次取花生米的人只能取一粒,以后取花生米的数量不能超过前一个人取花生米数量的两倍;
3、为显示规则的公平性,Jerry可以选择先取或者后取。
Jerry当然还是希望最后一粒花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。
输入:
本题有多个测例,每个测例的输入是一个整数n,n大于零小于等于1000,代表花生米的数量。
n等于0表示输入结束,不需要处理。
输出:
每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。
输入样例:
1
2
3
4
5
0
输出样例:
0
1
0
0
1
code:
#include <iostream>
using namespace std;
int dp[1005][1005];
void Search(int n)
{
for(int i = 2; i <= n; i ++)
{
for(int j = i-1; j <= n; j++)
dp[i][j] = 1;
for(int j = 1; j < i-1; j++)
{
int flag = 0;
for(int k = 1; k <= j; k++)
{
if(dp[i-k][2*k] == 0)
{
flag = 1;
break;
}
}
dp[i][j] = flag;
}
}
}
int main()
{
int n;
while(cin >> n , n)
{
if(n == 1)
{
cout << 0 << endl;
continue;
}
Search(n);
cout << dp[n][1] << endl;
}
}
花生米(四)
时限: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
code;
#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;
}
花生米(五)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
五一长假第六天,Tom在QQ上遇到了Kitty。呵呵,Kitty,在离散数学课上认识的PPMM……等等!Tom恍然大悟:自己这一生除了看帖不回之外最大的错误就是离散数学没学好!
五一长假第七天,Tom和Jerry在仓库散步的时候发现了一堆花生米(仓库,呵呵,仓库…)。这次Tom制定分花生米规则如下:
???????1、首先选出最苦的一粒花生米,放到一个瓶子里;
???????2、把剩下的花生米做成花生酱,Tom和Jerry轮流取一些花生酱吃掉;
???????3、第一个取的人只能取1.0克,以后取花生酱的数量不能少于两个人已经取过的总数量且不能超过两个人已经取过的总数量的三倍;
?????? 4、不能按规则3取花生酱的人必须吃掉瓶子里的花生米;
?????? 5、为显示规则的公平性,Jerry可以选择先取或者后取。
Jerry当然希望瓶子里的花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。
输入:
本题有多个测例,每个测例的输入是一个浮点数w,w大于1.0小于等于1000.0,w最多只有一位小数,代表花生酱的数量,单位为克。
w小于0表示输入结束,不需要处理。
输出:
每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。
输入样例:
1.5
7.9
-1
输出样例:
1
0
code:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
double w;
int dp[1005];
int run()
{
memset(dp,0,sizeof(dp));
dp[0]=0;
for(int i=1;i<=(int)w;i++)
{
for(int j=0;j<i;j++)
{
if(i-j>=(int)w-i && i-j<=3*((int)w-i) && dp[j]==0) dp[i]=1;
}
}
return 1-dp[(int)(w-1)];
}
int main()
{
while(cin >> w)
{
if(w<0) break;
cout << run() << endl;
}
return 0;
}