CodeForces - 546CSoldier and Cards (vector或队列)
Posted sky-stars
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 546CSoldier and Cards (vector或队列)相关的知识,希望对你有一定的参考价值。
Soldier and Cards
老样子,直接上国语吧
Descriptions:
两个人打牌,从自己的手牌中抽出最上面的一张比较大小,大的一方可以拿对方的手牌以及自己打掉的手牌重新作为自己的牌,放在自己手牌的最下方,而且对方输掉的那张手牌需要放在上面,自己赢的手牌放在下面。
Input
第一行的数n代表一共有几张牌
第二行第一个数x代表第一个人有x张牌
第三行第一个数y代表第二个人有y张牌
Output
第一个数代表进行了几轮,第二个数代表谁赢
Examples
Input4
2 1 3
2 4 2
Output6 2
Input3
1 2
2 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;
以上是关于CodeForces - 546CSoldier and Cards (vector或队列)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #546 (Div. 2)
网络流(最大流) CodeForces 546E:Soldier and Traveling