HDU 4023 (博弈 贪心 模拟) Game

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

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

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

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

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

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

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

 1 #include <cstdio>
 2 
 3 int a[16];
 4 
 5 int main()
 6 {
 7     //freopen("in.txt", "r", stdin);
 8 
 9     int T; scanf("%d", &T);
10     for(int kase = 1; kase <= T; ++kase)
11     {
12         for(int i = 1; i <= 15; i++) scanf("%d", &a[i]);
13         int now = 0, A = a[1] * 2, B = a[2] * 2;
14         if(a[15] % 2 != 0) { A++; now = 1; }
15         int ta = a[5] + a[6], tb = a[3] + a[4];
16         if(ta > tb)//Alice抢5,6, Bob抢3,4
17         {
18             ta -= tb;
19             if(ta % 2 != 0)
20             {
21                 if(now == 0) A += ta/2 + 1;
22                 else A += ta / 2;
23                 now = 1 - now;
24             }
25             else A += ta / 2;
26         }
27         else if(ta < tb)
28         {
29             tb -= ta;
30             if(tb % 2 != 0)
31             {
32                 if(now == 0) B += tb / 2;
33                 else B += tb/2 + 1;
34                 now = 1 - now;
35             }
36             else B += tb / 2;
37         }
38         //两人瓜分11,12,13,14
39         int t = a[11] + a[12] + a[13] + a[14];
40         if(t % 2 != 0) now = 1 - now;
41         //Alice抢7,8, Bob抢9,10
42         ta = a[7] + a[8]; tb = a[9] + a[10];
43         if(ta < tb)
44         {
45             tb -= ta;
46             if(tb % 2 != 0)
47             {
48                 if(now == 0) B += tb/2 + 1;
49                 else B += tb / 2;
50                 now = 1 - now;
51             }
52             else B += tb / 2;
53         }
54         else if(ta > tb)
55         {
56             ta -= tb;
57             if(ta % 2 != 0)
58             {
59                 if(now == 0) A += ta / 2;
60                 else A += ta/2 + 1;
61                 now = 1 - now;
62             }
63             else A += ta / 2;
64         }
65 
66         bool win;
67         if(now == 0) win = B >= A ? false : true;
68         else win = A >= B ? true : false;
69         printf("Case #%d: %s\n", kase, win ? "Alice" : "Bob");
70     }
71 
72     return 0;
73 }
代码君

 

posted @ 2015-04-11 20:50  AOQNRMGYXLMV  阅读(250)  评论(0编辑  收藏  举报