标签:png pre splay size 输入格式 ref 区间 logs ima
这个题目看了很久想不到方法,看了下提示,要用到博弈论的知识,而且还是Nim游戏,因此特意学习了Nim游戏:传送门~
我觉得我不能讲的比他还要好了^_^,感谢一下博主。
这个题目我们转化一下,就成了Nim游戏。
将小和尚两两分组,就像这样:
值得注意的一点是,区间间隔可能会增加,也可能会减少。
1 /* 2 * 博弈论 3 * 尼姆博弈 - Nim 4 * 再此警告一下一下自己啊, 千万不要用 new 来分配内存 5 * 不然怎么错的都不知道...... 6 * 内存泄漏会导致返回值不一定为 0 7 * 但是比赛必须为 0 8 */ 9 #include<iostream> 10 #include<string> 11 #include<sstream> 12 #include<cstdio> 13 14 using namespace std; 15 16 void fun(int *a, int n) 17 { 18 int x[109] = {0}; 19 int k = 0, mx = 0, loc = 0; 20 for(int i=1;i<n;i+=2) 21 x[k++] = a[i] - a[i-1] - 1; 22 int t = 0; 23 for(int i=0;i<k;i++){ 24 t ^= x[i]; 25 } 26 if(!t){ // 平衡态先手必输 27 cout<<-1<<‘\n‘; 28 return; 29 } 30 int temp = 0; 31 for(int j=0;j<n;j++){ 32 for(int k=a[j]+1;k<a[j+1];k++){ 33 if(j&1){ // 增大间距 34 if(!(t^x[j>>1]^(k-a[j-1]-1))){ 35 printf("%d %d\n", a[j], k); 36 return; 37 } 38 } 39 else{ // 缩小间距 40 if(!(t^x[j>>1]^(a[j+1]-k-1))){ 41 printf("%d %d\n", a[j], k); 42 return; 43 } 44 } 45 } 46 } 47 /* 48 for(int j=0;j<k;j++) 49 cout<<x[j]<<‘ ‘; 50 */ 51 } 52 53 int main() 54 { 55 string s; 56 while(getline(cin, s)) 57 { 58 stringstream ss(s); 59 int x = 0, i = 0; 60 int a[109] = {0}; 61 while(ss>>a[i++]); 62 ss.clear(); 63 fun(a, i-1); 64 /* 65 for(int j=0;j<i-1;j++) 66 cout<<a[j]<<‘ ‘; 67 cout<<‘\n‘; 68 */ 69 } 70 71 return 0; 72 }
2019-02-26
22:04:08
标签:png pre splay size 输入格式 ref 区间 logs ima
原文地址:https://www.cnblogs.com/mabeyTang/p/10440533.html