EOJ——2019.9月賽 A 才藝展現 (博弈+打表找規律)

題目連接:https://acm.ecnu.edu.cn/contest/196/problem/A/c++

題目:git

 

 

 解題報告:算法

  因爲必勝點是 n,因此 n 點的必勝狀態爲yes(走到這個點的人必勝),考慮 n-1 到 n/2+1 這一段(由於這一段都沒法整除),因此 i 點的狀態能夠由i+1獲得,接着從再從n/2推到1,因爲有兩種取法,因此對於當前狀態 i,若是 i+1或者 2*i 的狀態(這兩點的狀態前面已經推出來了),有一個爲yes,那麼這個 i 點的狀態就爲no(由於前面是由二者取最優的決策得出的),由於我走到這裏,另外一個玩家就能夠從這裏開始轉移到下一個他必勝的狀態。
ide

  因此由前面的結論,將Cuber QQ Win贏的狀況的前10000項打表O(n)後,發現表中每一個偶數項都能被8整除,奇數項能經過前一個偶數項+2獲得。spa

  打表代碼:code

 1 #include<bits/stdc++.h>
 2 #define numm ch-48
 3 using namespace std;  4 template <typename T>
 5 void read(T &res) {  6     bool flag=false;char ch;  7     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);  8     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);  9     flag&&(res=-res); 10 } 11 template <typename T>
12 void write(T x) { 13     if(x<0) putchar('-'),x=-x; 14     if(x>9) write(x/10); 15     putchar(x%10+'0'); 16 } 17 typedef pair<int,int> pi; 18 typedef long long ll; 19 const int maxn=10010; 20 int a[maxn]; 21 int main() 22 { 23     int n; 24     #define local
25  #ifdef local 26         freopen("1.txt","w",stdout); 27     #endif
28 
29     #define p1 puts("Little Fang Win")
30     #define p2 puts("Cuber QQ Win")
31     for(int j=2;j<=10000;j++) { 32         n=j; 33         if(n==1) { 34  p1; 35             continue; 36  } 37         if(n%2) { 38             a[n]=1; 39             n--; 40             a[n]=0; 41             for(int i=n-1;i>n/2&&i>1;i--) 42                 if((n-i)%2) a[i]=1; 43                 else a[i]=0; 44  } 45         else { 46             a[n]=1; 47             for(int i=n-1;i>n/2&&i>1;i--) 48                 if((n-i)%2) a[i]=0; 49                 else a[i]=1; 50 
51  } 52         for(int i=n/2;i>1;i--) 53             a[i]=max(a[i*2],a[i+1])?0:1; 54         if(a[2]) write(j),cout<<"->",p2; 55  } 56     return 0; 57 }
代碼在這裏!

  而後將偶數項除以8拿出來,發現有規律的(其實口述很差說),序列是1,4,5,16,17,20,21,64,65,68,69,80,81,84,85。規律就本身看了,而後用vector打表發現存不下,後來寫個算法把n往1推,發現4234這個數行不通,賽後看題解是有關二進制的,只要全部奇數位都爲0,那麼就是Cuber QQ Win,反之Little Fang Win,懵逼國有懵逼路,懵逼樹旁懵逼樹,懵逼樹下只有我...blog

  AC代碼:get

 1 #include<bits/stdc++.h>
 2 #define numm ch-48
 3 using namespace std;  4 template <typename T>
 5 void read(T &res) {  6     bool flag=false;char ch;  7     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);  8     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);  9     flag&&(res=-res); 10 } 11 template <typename T>
12 void write(T x) { 13     if(x<0) putchar('-'),x=-x; 14     if(x>9) write(x/10); 15     putchar(x%10+'0'); 16 } 17 typedef long long ll; 18 #define p1 puts("Little Fang Win")
19 #define p2 puts("Cuber QQ Win")
20 int main() 21 { 22     int _; 23  ll n; 24  read(_); 25     while(_--) { 26  read(n); 27         bitset<64>b(n); 28         bool flag=false; 29         for(int i=0;i<63;i+=2) 30             if(b[i]) { 31  p1; 32                 flag=true; 33                 break; 34  } 35         if(!flag) p2; 36  } 37     return 0; 38 }
代碼在這裏!
相關文章
相關標籤/搜索