日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #304 C(Div. 2)(模拟)

發(fā)布時間:2025/6/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #304 C(Div. 2)(模拟) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:?

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;

?

思路:直接用棧模擬,關鍵的地方是判斷兩方都不能贏的情況,判斷方法有兩種:

其一是設一個足夠大的數(shù),超過這個步數(shù)還沒有分出輸贏情況的話則可以認定

兩方都不能贏,因為n<=10,如果能分出輸贏的話則500步以內(nèi)一定會出結果的!

另一種方法是判斷當前狀態(tài)之前是否出現(xiàn)過,若出現(xiàn)過,則其一定不能分出輸贏!會死循環(huán)!

至于如何判斷是否出現(xiàn)過,可以將每個狀態(tài)都存入一個string數(shù)組中,再將當當前狀態(tài)與之對比,若出現(xiàn)過,則平局;

?

代碼分別如下:

方法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依次從隊尾加入stk1隊列,并將stk2,stk1隊首元素y, x拋掉; 33 { 34 stk1.push(y); 35 stk1.push(x); 36 stk1.pop(); 37 stk2.pop(); 38 } 39 else //****如果x<y,將x, y依次從隊尾加入stk2隊列,并將stk2, stk1隊首元素y, x拋掉; 40 { 41 stk2.push(x); 42 stk2.push(y); 43 stk2.pop(); 44 stk1.pop(); 45 } 46 cnt++; 47 if(stk1.empty()) //****隊列stk1為空,即2贏了 48 { 49 cout << cnt << " " << "2" << endl; 50 return 0; 51 } 52 if(stk2.empty()) //****隊列stk2為空,即1贏了 53 { 54 cout << cnt << " " << "1" << endl; 55 return 0; 56 } 57 if(cnt>500) break; //****如果步數(shù)大于500還沒分輸贏,即可判平局 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++) //***判斷當前狀態(tài)是否出現(xiàn)過,若出現(xiàn)過,則平局 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依次從隊尾加入stk1隊列,并將stk2,stk1隊首元素y, x拋掉; 68 { 69 stk1.push(y); 70 stk1.push(x); 71 stk1.pop(); 72 stk2.pop(); 73 } 74 else //****如果x<y,將x, y依次從隊尾加入stk2隊列,并將stk2, stk1隊首元素y, x拋掉; 75 { 76 stk2.push(x); 77 stk2.push(y); 78 stk2.pop(); 79 stk1.pop(); 80 } 81 cnt++; 82 if(stk1.empty()) //****隊列stk1為空,即2贏了 83 { 84 flag=2; 85 break; 86 } 87 if(stk2.empty()) //****隊列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

總結

以上是生活随笔為你收集整理的Codeforces Round #304 C(Div. 2)(模拟)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。