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 }