您的位置:首页 > 其它

HDU 4023 (博弈 贪心 模拟) Game

2015-04-11 20:50 337 查看
如果硬要说这算是博弈题目的话,那这个博弈是不公平博弈(partizan games),因为双方面对同一个局面做出来的决策是不一样的。

我们平时做的博弈都是公平博弈(impartial games),所以在这道题里面,那些必胜必败状态,SG函数SG定理都派不上用场了。

但是,这道题是可以贪心的。

比如第一个图案对于Alice来说是安全稳定的,因为Bob不会跟他去抢位置,所以Alice可以省到最后去放。同样地,Bob可以将第2个图案省到最后再去放。

比如说第15个图案,如果能抢先占到的话会很划算的,因为如果一方占到,不光对方放不了了,自己还会多一个稳定位。

更详细的分析见这:http://www.cnblogs.com/staginner/archive/2011/09/10/2173317.html

我发现大家的思路都是按照这个来的。

#include <cstdio>

int a[16];

int main()
{
//freopen("in.txt", "r", stdin);

int T; scanf("%d", &T);
for(int kase = 1; kase <= T; ++kase)
{
for(int i = 1; i <= 15; i++) scanf("%d", &a[i]);
int now = 0, A = a[1] * 2, B = a[2] * 2;
if(a[15] % 2 != 0) { A++; now = 1; }
int ta = a[5] + a[6], tb = a[3] + a[4];
if(ta > tb)//Alice抢5,6, Bob抢3,4
{
ta -= tb;
if(ta % 2 != 0)
{
if(now == 0) A += ta/2 + 1;
else A += ta / 2;
now = 1 - now;
}
else A += ta / 2;
}
else if(ta < tb)
{
tb -= ta;
if(tb % 2 != 0)
{
if(now == 0) B += tb / 2;
else B += tb/2 + 1;
now = 1 - now;
}
else B += tb / 2;
}
//两人瓜分11,12,13,14
int t = a[11] + a[12] + a[13] + a[14];
if(t % 2 != 0) now = 1 - now;
//Alice抢7,8, Bob抢9,10
ta = a[7] + a[8]; tb = a[9] + a[10];
if(ta < tb)
{
tb -= ta;
if(tb % 2 != 0)
{
if(now == 0) B += tb/2 + 1;
else B += tb / 2;
now = 1 - now;
}
else B += tb / 2;
}
else if(ta > tb)
{
ta -= tb;
if(ta % 2 != 0)
{
if(now == 0) A += ta / 2;
else A += ta/2 + 1;
now = 1 - now;
}
else A += ta / 2;
}

bool win;
if(now == 0) win = B >= A ? false : true;
else win = A >= B ? true : false;
printf("Case #%d: %s\n", kase, win ? "Alice" : "Bob");
}

return 0;
}


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