标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1799 Accepted Submission(s): 650
题目大意:
题目是说,现在有n堆石子,A和B两人分别轮流用最优秀的策略来完成比赛,他们可以合并任意两堆石子,也可以把某一堆的某个石子减去1个。
两个任都绝对的聪明,问最后不能进行操作的选手是谁。
解题思路:
看到博弈题目,我也很慌,基本没有怎么A过,练习的时候也没有过,还是看别人的题解才过的,这道题不难,把握住以下规律就能A。
1.全部是1的时候,是3的倍数时输否则赢;
2.只有一堆2其他全是1的时候,1的堆数是3的倍数时输否则赢;
3.其他情况下,计算出总和+堆数-1,若为偶数,且1的堆数是偶数,则一定输;
4.不在上述情况下则赢。
代码:
# include<cstdio>
# include<iostream>
using namespace std;
int main(void)
{
int icase = 1;
int t; scanf("%d",&t);
while ( t-- )
{
int ans = 0,one = 0, flag = 1;
int n; scanf("%d",&n);
for ( int i = 0;i < n;i++ )
{
int tmp; scanf("%d",&tmp);
if ( tmp==1 )
one++;
ans += tmp;
}
if ( ans==one||ans==one+2 )
{
if ( one%3==0 )
flag = 0;
}
else
{
ans += n;
ans--;
if ( (ans&1)==0&&(one&1)==0 )
flag = 0;
}
printf("Case #%d: ",icase++);
if ( flag )
puts("Alice");
else
puts("Bob");
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/wikioibai/p/4758882.html