ACM一道简单博弈论题目 解答给高分

假设现在总共n(n<=100)堆石子,每堆石子有Si(Si<=1000)颗石子。两人轮流取石子,规则是每次可以任选第i堆石子取,但是这堆石子的个数需要大于i,而且若取的话... 假设现在总共n(n<=100)堆石子,每堆石子有Si(Si<=1000)颗石子。两人轮流取石子,规则是每次可以任选第i堆石子取,但是这堆石子的个数需要大于i,而且若取的话只能取走i颗石子。最终无法取石子者败。给定一个局面,并假设博弈两人都使用最优策略,问先手是否有必胜策略。
输入
3
1 2 3
应当输出
YES
展开
 我来答
汐_枫
2013-05-15 · TA获得超过329个赞
知道小有建树答主
回答量:342
采纳率:0%
帮助的人:267万
展开全部
#include<stdio.h>
int main()
{
int n,count,i,s;
while(scanf("%d",&n)!=EOF)
{
count=0;//最多取几次,显然count是奇数时先手就赢啦
for(i=1;i<=n;i++)
{
scanf("%d",&s);
count+=(a/i);
}
//printf("%d",count);
if(count%2==1)
printf("YES\n");
else printf("NO\n");//count==0时信息不足,情况怎么样不太确定
}
return 0;
}
//俺也不是很确定算法对不对,错的话勿喷啊,俺也是新手一个
追问
count+=(a/i);  a是哪出来的
追答
不好意思,原来是int a的,不过我看你的题是要si的,我怕你看不懂,就把a改掉了,可惜改的不够彻底啊,抱歉啦
匿名用户
2013-05-15
展开全部
赞同楼上,我也用c++写了下。
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;

void main()
{
int N = 0 , x = 0;

cout << "请输入堆数:"<<endl;
cin >> N;

vector<int> S(3);

for( int i=0 ; i<N ; ++i )
{
cout << "输入第" << i <<"堆石子个数:" ;
cin >> x;
if( x>=i)
S[i] = x;
else
{
cout << "输入错误!" << endl;
exit(1);
}
}
int sum = 0 ; //两人总共可以出手次数

for( int j=0; j<N; ++j )
{
sum += S[j] / ( j+1 );
}
if( sum%2 == 0 )
cout << "NO" <<endl;
else
cout << "YES" <<endl;

system(" pause ");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式