您的位置:首页 > 其它

【算法总结】博弈论相关

2018-04-19 20:45 190 查看

〖相关资料〗

《博弈论 SG函数》

〖相关题目〗

1.【bzoj1188】[HNOI2007]分裂游戏

题意:共有n个瓶子,标号为0,1,2.....n-1,第i个瓶子中装有p[i]颗巧克力豆,两个人轮流取豆子,每一轮每人选择3个瓶子,标号为i,j,k,并要保证i<j,j<=k且第i个瓶子中至少要有1颗巧克力豆。随后这个人从第i个瓶子中拿走一颗豆子并在j,k中各放入一粒豆子(j可能等于k)。如果轮到某人而他无法按规则取豆子,那么他将输掉比赛。问先手必胜策略的第一步方案。

分析:hzwerの博客

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int n,p[30],a[105],c[105];
LL ans;
int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i]=read();
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)c[i]=a[i];
for(int i=n;i>=1;i--)
{
for(int j=30;j>=0;j--)
{
if(!(a[i]&(1<<j)))continue;
if(!p[j]){p[j]=a[i];break;}
a[i]^=p[j];
}
if(!a[i])ans+=c[i];
}
printf("%lld",ans);
return 0;
}
View Code

  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: