Codeforces Round #304 C(Div. 2)(模拟)
2016-09-22 17:41
375 查看
题目链接:
http://codeforces.com/problemset/problem/546/C
题意:
总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张,分别为:y1, y2, ...yk2;(n<=10&&k1+k2==n,所有牌的数字都不同);
依次比较x1, y1的大小,若x1>y1,依次将x1, y1加入x牌最底下;反之则将y1,x1依次加入y牌最底下;直至有方的牌输完为止;输出总共游戏的步数和赢方;
如果两方都不能赢,则输出-1;
思路:直接用栈模拟,关键的地方是判断两方都不能赢的情况,判断方法有两种:
其一是设一个足够大的数,超过这个步数还没有分出输赢情况的话则可以认定
两方都不能赢,因为n<=10,如果能分出输赢的话则500步以内一定会出结果的!
另一种方法是判断当前状态之前是否出现过,若出现过,则其一定不能分出输赢!会死循环!
至于如何判断是否出现过,可以将每个状态都存入一个string数组中,再将当当前状态与之对比,若出现过,则平局;
代码分别如下:
方法1:
方法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,所有牌的数字都不同);
依次比较x1, y1的大小,若x1>y1,依次将x1, y1加入x牌最底下;反之则将y1,x1依次加入y牌最底下;直至有方的牌输完为止;输出总共游戏的步数和赢方;
如果两方都不能赢,则输出-1;
思路:直接用栈模拟,关键的地方是判断两方都不能赢的情况,判断方法有两种:
其一是设一个足够大的数,超过这个步数还没有分出输赢情况的话则可以认定
两方都不能赢,因为n<=10,如果能分出输赢的话则500步以内一定会出结果的!
另一种方法是判断当前状态之前是否出现过,若出现过,则其一定不能分出输赢!会死循环!
至于如何判断是否出现过,可以将每个状态都存入一个string数组中,再将当当前状态与之对比,若出现过,则平局;
代码分别如下:
方法1:
#include<bits/stdc++.h> #define MAXN 10000 #define MAX 1000000000 #define eps 1e-6 #define ll long long using namespace std; int main(void) { queue<int> stk1, stk2; string str1[MAXN], str2[MAXN]; int n, a, b, ans=0; cin >> n; cin >> a; for(int i=0; i<a; i++) { int x; cin >> x; stk1.push(x); } cin >> b; for(int i=0; i<b; i++) { int x; cin >> x; stk2.push(x); } int cnt=0, flag; while(1) { int x=stk1.front(), y=stk2.front(); if(x>y) //****如果x>y,将y, x依次从队尾加入stk1队列,并将stk2,stk1队首元素y, x抛掉; { stk1.push(y); stk1.push(x); stk1.pop(); stk2.pop(); } else //****如果x<y,将x, y依次从队尾加入stk2队列,并将stk2, stk1队首元素y, x抛掉; { stk2.push(x); stk2.push(y); stk2.pop(); stk1.pop(); } cnt++; if(stk1.empty()) //****队列stk1为空,即2赢了 { cout << cnt << " " << "2" << endl; return 0; } if(stk2.empty()) //****队列stk2为空,即1赢了 { cout << cnt << " " << "1" << endl; return 0; } if(cnt>500) break; //****如果步数大于500还没分输赢,即可判平局 } cout << "-1" << endl; return 0; }
方法2:
#include<bits/stdc++.h> #define MAXN 10000 #define MAX 1000000000 #define eps 1e-6 #define ll long long using namespace std; int main(void) { queue<int> stk1, stk2; string str1[MAXN], str2[MAXN]; int n, a, b, ans=0; cin >> n; cin >> a; for(int i=0; i<a; i++) { int x; cin >> x; stk1.push(x); } cin >> b; for(int i=0; i<b; i++) { int x; cin >> x; stk2.push(x); } int cnt=0, flag; while(1) { int low1[MAXN], low2[MAXN], k1=0, k2=0; while(!stk1.empty()) //**将stk1存入string数组中 { low1[k1++]=stk1.front(); stk1.pop(); } for(int i=0; i<k1; i++) { stk1.push(low1[i]); } for(int i=0; i<k1; i++) { str1[cnt]+=to_string(low1[i]); } while(!stk2.empty()) //****将stk2存入string数组中 { low2[k2++]=stk2.front(); stk2.pop(); } for(int i=0; i<k2; i++) { stk2.push(low2[i]); } for(int i=0; i<k2; i++) { str2[cnt]+=to_string(low2[i]); } for(int i=0; i<cnt; i++) //***判断当前状态是否出现过,若出现过,则平局 { if(str1[i]==str1[cnt]&&str2[i]==str2[cnt]) { cout << "-1" << endl; return 0; } } int x=stk1.front(), y=stk2.front(); if(x>y) //****如果x>y,将y, x依次从队尾加入stk1队列,并将stk2,stk1队首元素y, x抛掉; { stk1.push(y); stk1.push(x); stk1.pop(); stk2.pop(); } else //****如果x<y,将x, y依次从队尾加入stk2队列,并将stk2, stk1队首元素y, x抛掉; { stk2.push(x); stk2.push(y); stk2.pop(); stk1.pop(); } cnt++; if(stk1.empty()) //****队列stk1为空,即2赢了 { flag=2; break; } if(stk2.empty()) //****队列stk2为空,即1赢了 { flag=1; break; } } cout << cnt << " " << flag << endl; return 0; }
相关文章推荐
- Codeforces Round #385 (Div. 2) A,B,C 暴力,模拟,并查集
- Codeforces Round #362 (Div. 2) B 模拟
- div 模拟 select
- 关于使用css将DIV模拟成为表格
- Codeforces Round #147 (Div. 2) / 237A Free Cash (模拟)
- div 模拟select
- 【Codeforces Round 375 (Div 2) B】【水模拟】Text Document Analysis
- Codeforces Round #247 (Div. 2) B. Shower Line(简单模拟)
- div,模拟,模态对话框[非常实用]
- Codeforces Round #363 (Div. 2) C. Vacations【n-dp(max) or 暴力模拟】
- Codeforces Round #295 (Div. 1) B. Cubes(最大最小堆+拓扑模拟)
- 【Codeforces Round 362 (Div 2)B】【模拟】Barnicle 科学计数法转普通表示法
- Educational Codeforces Round 37 (Rated for Div. 2)-E-Connected Components?(模拟/暴力)
- Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟
- Codeforces Round #395(Div. 2)B. Timofey and cubes【模拟】
- Codeforces Round #316 (Div. 2)-A. Elections-模拟水题22
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A B C D 水 模拟 二分 贪心
- Codeforces Round #339 (Div. 2) (B 模拟)
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) A B C D 模拟
- 用DIV模拟TEXTAREA【QQ空间说说对话框】