Codeforces Round #304 C(Div. 2)(模拟)
題目鏈接:?
http://codeforces.com/problemset/problem/546/C
?
題意:
總共有n張牌,1手中有k1張分別為:x1, x2, x3, ..xk1,2手中有k2張,分別為:y1, y2, ...yk2;(n<=10&&k1+k2==n,所有牌的數(shù)字都不同);
依次比較x1, y1的大小,若x1>y1,依次將x1, y1加入x牌最底下;反之則將y1,x1依次加入y牌最底下;直至有方的牌輸完為止;輸出總共游戲的步數(shù)和贏方;
如果兩方都不能贏,則輸出-1;
?
思路:直接用棧模擬,關(guān)鍵的地方是判斷兩方都不能贏的情況,判斷方法有兩種:
其一是設(shè)一個(gè)足夠大的數(shù),超過(guò)這個(gè)步數(shù)還沒(méi)有分出輸贏情況的話則可以認(rèn)定
兩方都不能贏,因?yàn)閚<=10,如果能分出輸贏的話則500步以內(nèi)一定會(huì)出結(jié)果的!
另一種方法是判斷當(dāng)前狀態(tài)之前是否出現(xiàn)過(guò),若出現(xiàn)過(guò),則其一定不能分出輸贏!會(huì)死循環(huán)!
至于如何判斷是否出現(xiàn)過(guò),可以將每個(gè)狀態(tài)都存入一個(gè)string數(shù)組中,再將當(dāng)當(dāng)前狀態(tài)與之對(duì)比,若出現(xiàn)過(guò),則平局;
?
代碼分別如下:
方法1:
1 #include<bits/stdc++.h> 2 #define MAXN 10000 3 #define MAX 1000000000 4 #define eps 1e-6 5 #define ll long long 6 using namespace std; 7 8 int main(void) 9 { 10 queue<int> stk1, stk2; 11 string str1[MAXN], str2[MAXN]; 12 int n, a, b, ans=0; 13 cin >> n; 14 cin >> a; 15 for(int i=0; i<a; i++) 16 { 17 int x; 18 cin >> x; 19 stk1.push(x); 20 } 21 cin >> b; 22 for(int i=0; i<b; i++) 23 { 24 int x; 25 cin >> x; 26 stk2.push(x); 27 } 28 int cnt=0, flag; 29 while(1) 30 { 31 int x=stk1.front(), y=stk2.front(); 32 if(x>y) //****如果x>y,將y, x依次從隊(duì)尾加入stk1隊(duì)列,并將stk2,stk1隊(duì)首元素y, x拋掉; 33 { 34 stk1.push(y); 35 stk1.push(x); 36 stk1.pop(); 37 stk2.pop(); 38 } 39 else //****如果x<y,將x, y依次從隊(duì)尾加入stk2隊(duì)列,并將stk2, stk1隊(duì)首元素y, x拋掉; 40 { 41 stk2.push(x); 42 stk2.push(y); 43 stk2.pop(); 44 stk1.pop(); 45 } 46 cnt++; 47 if(stk1.empty()) //****隊(duì)列stk1為空,即2贏了 48 { 49 cout << cnt << " " << "2" << endl; 50 return 0; 51 } 52 if(stk2.empty()) //****隊(duì)列stk2為空,即1贏了 53 { 54 cout << cnt << " " << "1" << endl; 55 return 0; 56 } 57 if(cnt>500) break; //****如果步數(shù)大于500還沒(méi)分輸贏,即可判平局 58 } 59 cout << "-1" << endl; 60 return 0; 61 }?
方法2:
1 #include<bits/stdc++.h> 2 #define MAXN 10000 3 #define MAX 1000000000 4 #define eps 1e-6 5 #define ll long long 6 using namespace std; 7 8 int main(void) 9 { 10 queue<int> stk1, stk2; 11 string str1[MAXN], str2[MAXN]; 12 int n, a, b, ans=0; 13 cin >> n; 14 cin >> a; 15 for(int i=0; i<a; i++) 16 { 17 int x; 18 cin >> x; 19 stk1.push(x); 20 } 21 cin >> b; 22 for(int i=0; i<b; i++) 23 { 24 int x; 25 cin >> x; 26 stk2.push(x); 27 } 28 int cnt=0, flag; 29 while(1) 30 { 31 int low1[MAXN], low2[MAXN], k1=0, k2=0; 32 while(!stk1.empty()) //**將stk1存入string數(shù)組中 33 { 34 low1[k1++]=stk1.front(); 35 stk1.pop(); 36 } 37 for(int i=0; i<k1; i++) 38 { 39 stk1.push(low1[i]); 40 } 41 for(int i=0; i<k1; i++) 42 { 43 str1[cnt]+=to_string(low1[i]); 44 } 45 while(!stk2.empty()) //****將stk2存入string數(shù)組中 46 { 47 low2[k2++]=stk2.front(); 48 stk2.pop(); 49 } 50 for(int i=0; i<k2; i++) 51 { 52 stk2.push(low2[i]); 53 } 54 for(int i=0; i<k2; i++) 55 { 56 str2[cnt]+=to_string(low2[i]); 57 } 58 for(int i=0; i<cnt; i++) //***判斷當(dāng)前狀態(tài)是否出現(xiàn)過(guò),若出現(xiàn)過(guò),則平局 59 { 60 if(str1[i]==str1[cnt]&&str2[i]==str2[cnt]) 61 { 62 cout << "-1" << endl; 63 return 0; 64 } 65 } 66 int x=stk1.front(), y=stk2.front(); 67 if(x>y) //****如果x>y,將y, x依次從隊(duì)尾加入stk1隊(duì)列,并將stk2,stk1隊(duì)首元素y, x拋掉; 68 { 69 stk1.push(y); 70 stk1.push(x); 71 stk1.pop(); 72 stk2.pop(); 73 } 74 else //****如果x<y,將x, y依次從隊(duì)尾加入stk2隊(duì)列,并將stk2, stk1隊(duì)首元素y, x拋掉; 75 { 76 stk2.push(x); 77 stk2.push(y); 78 stk2.pop(); 79 stk1.pop(); 80 } 81 cnt++; 82 if(stk1.empty()) //****隊(duì)列stk1為空,即2贏了 83 { 84 flag=2; 85 break; 86 } 87 if(stk2.empty()) //****隊(duì)列stk2為空,即1贏了 88 { 89 flag=1; 90 break; 91 } 92 } 93 cout << cnt << " " << flag << endl; 94 return 0; 95 }?
轉(zhuǎn)載于:https://www.cnblogs.com/geloutingyu/p/5897305.html
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #304 C(Div. 2)(模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spark on yarn :state
- 下一篇: C++ Map用法详解