hdu 4023 Game 博弈论

思路:

将15种分成5类:

1.1和2为一类;

2.3,4,5,6为一类;

3.7,8,9,10为一类;

4.11,12,13,14,15为一类;

5.15为一类。

比较各类的优先级,就会发现放置的顺序为5->2->4->3->1.

代码如下:

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<algorithm>
  4 #include<iomanip>
  5 #include<cmath>
  6 #include<cstring>
  7 #include<vector>
  8 #define ll __int64
  9 #define pi acos(-1.0)
 10 #define MAX 50000
 11 using namespace std;
 12 int p[16];
 13 int fun1(int n)
 14 {
 15     if(n&1) return n-1;
 16     return n;
 17 }
 18 int fun2(int n)
 19 {
 20     if(n&1) return n+1;
 21     return n;
 22 }
 23 int main(){
 24     int t,a,b,k,i,j,ca=0,ans;
 25     scanf("%d",&t);
 26     while(t--){
 27         a=b=0;
 28         int num1,num2,num34,num56,num78,num910,num11_14,num15;
 29         bool flag=0;
 30         for(i=1;i<=15;i++)
 31             scanf("%d",&p[i]);
 32         if(p[1]>p[2]) num1=p[1]-p[2],num2=0;
 33         else num2=p[2]-p[1],num1=0;
 34         if(p[3]+p[4]>p[5]+p[6]) num34=p[3]+p[4]-p[5]-p[6],num56=0;
 35         else num56=p[5]+p[6]-p[4]-p[3],num34=0;
 36         if(p[7]+p[8]>p[9]+p[10]) num78=p[7]+p[8]-p[9]-p[10],num910=0;
 37         else num910=p[9]+p[10]-p[8]-p[7],num78=0;
 38         num11_14=p[11]+p[12]+p[13]+p[14];
 39         num15=p[15];
 40         if(p[15]&1){
 41             a+=2;
 42             flag=1;
 43         }
 44         if(num34){
 45             if(flag){
 46                 a+=num34/2;
 47                 b+=fun2(num34);
 48                 if(num34&1) flag=0;
 49             }
 50             else{
 51                 a+=(num34+1)/2;
 52                 b+=fun1(num34);
 53                 if(num34&1) flag=1;
 54             }
 55         }
 56         else{
 57             if(flag){
 58                 b+=(num56+1)/2;
 59                 a+=fun1(num56);
 60                 if(num56&1) flag=0;
 61             }
 62             else{
 63                 a+=fun2(num56);
 64                 b+=num56/2;
 65                 if(num56&1) flag=1;
 66             }
 67         }
 68         if(num11_14&1){
 69             if(flag) b++;
 70             else a++;
 71             flag=!flag;
 72         }
 73         if(num78){
 74             if(flag){//B
 75                 b+=(num78+1)/2;
 76                 a+=num78;
 77                 if(num78&1) flag=0;
 78             }
 79             else{//A
 80                 a+=num78;
 81                 b+=num78/2;
 82                 if(num78&1) flag=1;
 83             }
 84         }
 85         else{
 86             if(!flag){ //A
 87                 a+=(num910+1)/2;
 88                 b+=num910;
 89                 if(num910&1) flag=1;
 90             }
 91             else{//B
 92                 b+=num910;
 93                 a+=num910/2;
 94                 if(num910&1) flag=0;
 95             }
 96         }
 97         a+=num1*2;
 98         b+=num2*2;
 99         printf("Case #%d: ",++ca);
100         puts(a>b?"Alice":"Bob");
101     }
102     return 0;
103 }
View Code

 

posted @ 2013-08-31 14:42  _随心所欲_  阅读(196)  评论(0编辑  收藏  举报