Soldier and Cards
老样子,直接上国语吧
Descriptions:
两个人打牌,从自己的手牌中抽出最上面的一张比较大小,大的一方可以拿对方的手牌以及自己打掉的手牌重新作为自己的牌,放在自己手牌的最下方,而且对方输掉的那张手牌需要放在上面,自己赢的手牌放在下面。
Input
第一行的数n代表一共有几张牌
第二行第一个数x代表第一个人有x张牌
第三行第一个数y代表第二个人有y张牌
Output
第一个数代表进行了几轮,第二个数代表谁赢
Examples
Input
42 1 32 4 2
Output
6 2
Input
31 22 1 3
Output
-1
题目链接:
https://vjudge.net/problem/CodeForces-546C
我的做法可能有点偏了,因为不知道有几个牌,就用vector存一下,然后每次拿出双方的第一张牌进行比较,再进行模拟,现在想想可以用queue来写,当时写的有点粗糙,但是思路很清晰,一遍就AC了
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define ll long long #define INF 0x3f3f3f3f using namespace std; vector<int>a; vector<int>b; int n; int f,flag=1; int x,y; int sum=0; int main() { cin >> n; cin >> x; for(int i=0; i<x; i++) { int num; cin>>num; a.push_back(num); } cin>>y; for(int i=0; i<y; i++) { int num; cin>> num; b.push_back(num); } while(!a.empty()&&!b.empty())//两人的卡牌都不为空 { sum++; int num1=a.front();//都取出第一张卡牌进行比较 int num2=b.front(); if(num1>num2)//1号大于2号就把2号和自己的卡牌一次放在队尾 { a.push_back(num2); a.push_back(num1); vector<int>::iterator t1=a.begin(); vector<int>::iterator t2=b.begin(); a.erase(t1); b.erase(t2); } if(num2>num1)//2号大于1号就把1号和自己的卡牌一次放在队尾 { b.push_back(num1); b.push_back(num2); vector<int>::iterator t1=a.begin(); vector<int>::iterator t2=b.begin(); a.erase(t1); b.erase(t2); } if(!b.empty())//谁的卡牌为空谁就输了 f=2; if(!a.empty()) f=1; if(sum>=n*n*n*n*n*n)//判断一下,要是循环这么多次还没分出胜负,应该就是死循环了 { flag=0; cout<<"-1"<<endl; break; } } if(flag) cout<<sum<<" "<<f<<endl; return 0; }
原文地址:https://www.cnblogs.com/sky-stars/p/10994998.html
时间: 2024-10-07 14:42:13