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 }
代码君

 

你可能感兴趣的:(game)