#codeforces 546C# Soldier and Cards (模拟)
2015-05-26 01:14
1016 查看
题目链接:http://codeforces.com/problemset/problem/546/C
Description
Two bored soldiers are playing card war. Their card deck consists of exactly
n cards, numbered from 1 to
n, all values are different. They divide cards between them in some manner, it's possible that they have different number of cards. Then they play a "war"-like card game.
The rules are following. On each turn a fight happens. Each of them picks card from the top of his stack and puts on the table. The one whose card value is bigger wins this
fight and takes both cards from the table to the bottom of his stack. More precisely, he first takes his opponent's card and puts to the bottom of his stack, and then he puts his card to the bottom of his stack. If after
some turn one of the player's stack becomes empty, he loses and the other one wins.
You have to calculate how many fights will happen and who will win the game, or state that game won't end.
Input
First line contains a single integer n (2 ≤ n ≤ 10), the number of cards.
Second line contains integer k1 (1 ≤ k1 ≤ n - 1), the number of the first soldier's cards. Then follow
k1 integers that are the values on the first soldier's cards, from top to bottom of his stack.
Third line contains integer k2 (k1 + k2 = n), the number of the second
soldier's cards. Then follow k2 integers that are the values on the second soldier's cards, from top to bottom of his stack.
All card values are different.
Output
If somebody wins in this game, print 2 integers where the first one stands for the number of
fights before end of game and the second one is
1 or 2 showing which player has won.
If the game won't end and will continue forever output
- 1.
Sample Input
Input
Output
Input
Output
解题报告:纯模拟游戏过程,主要是判重,我的方法是将序列串成一个数,然后map判重。
Description
Two bored soldiers are playing card war. Their card deck consists of exactly
n cards, numbered from 1 to
n, all values are different. They divide cards between them in some manner, it's possible that they have different number of cards. Then they play a "war"-like card game.
The rules are following. On each turn a fight happens. Each of them picks card from the top of his stack and puts on the table. The one whose card value is bigger wins this
fight and takes both cards from the table to the bottom of his stack. More precisely, he first takes his opponent's card and puts to the bottom of his stack, and then he puts his card to the bottom of his stack. If after
some turn one of the player's stack becomes empty, he loses and the other one wins.
You have to calculate how many fights will happen and who will win the game, or state that game won't end.
Input
First line contains a single integer n (2 ≤ n ≤ 10), the number of cards.
Second line contains integer k1 (1 ≤ k1 ≤ n - 1), the number of the first soldier's cards. Then follow
k1 integers that are the values on the first soldier's cards, from top to bottom of his stack.
Third line contains integer k2 (k1 + k2 = n), the number of the second
soldier's cards. Then follow k2 integers that are the values on the second soldier's cards, from top to bottom of his stack.
All card values are different.
Output
If somebody wins in this game, print 2 integers where the first one stands for the number of
fights before end of game and the second one is
1 or 2 showing which player has won.
If the game won't end and will continue forever output
- 1.
Sample Input
Input
4 2 1 3 2 4 2
Output
6 2
Input
3 1 2 2 1 3
Output
-1
解题报告:纯模拟游戏过程,主要是判重,我的方法是将序列串成一个数,然后map判重。
#include <bits/stdc++.h> using namespace std; typedef long long LL; map<LL, bool> mp; queue<int> q1, q2; void op(queue<int>& qa, queue<int>& qb) { int x = qb.front(); qb.pop(); qa.push(x); x = qa.front(); qa.pop(); qa.push(x); } int main() { int n, s1, s2, x; cin >> n >> s1; for (int i = 0; i < s1; i ++) { cin >> x; q1.push(x); } cin >> s2; for (int i = 0; i < s2; i ++) { cin >> x; q2.push(x); } int cnt = 0, winner = -1; LL ans = 0; while (1) { ans = 0; queue<int> tq1(q1), tq2(q2); int size1 = q1.size(); while(!tq1.empty()) { x = tq1.front(); tq1.pop(); if(x == 10) x = 0; ans = 10 * ans + (LL)x; } while(!tq2.empty()) { x = tq2.front(); tq2.pop(); if(x == 10) x = 0; ans = 10 * ans + (LL)x; } ans = 10 * ans + (LL)size1; if(mp.find(ans) != mp.end()) { break; } mp[ans] = true; if(q1.front() > q2.front()) { op(q1, q2); } else { op(q2, q1); } cnt ++; if(q1.empty()) { winner = 2; break; } if(q2.empty()) { winner = 1; break; } } if(winner == -1) { printf("-1\n"); } else { printf("%d %d\n", cnt, winner); } return 0; }
相关文章推荐
- CodeForces 604A Uncowed Forces (模拟 oj 评分)
- Codeforces 439C Devu and Partitioning of the Array 模拟
- codeforces 116A Tram(模拟水题)
- codeforces 266A Stones on the Table(模拟水题)
- Codeforces 677B Vanya and Food Processor【模拟】
- CodeForces - 557A Ilya and Diplomas (模拟)水
- CodeForces - 754B Ilya and tic-tac-toe game(模拟)
- Codeforces - 834B. The Festive Evening - 思维、模拟
- CodeForces - 868B Race Against Time 简单模拟
- CodeForces 734D:Anton and Chess(模拟?)
- codeforces 614B(div.2) 模拟
- CodeForces - 868B Race Against Time(模拟)
- Codeforces 706E Working routine (模拟链表)
- Codeforces 202B Brand New Easy Problem(模拟)
- Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||
- 【STL】【模拟】Codeforces 696A Lorenzo Von Matterhorn
- CodeForces 471B MUH and Important Things 模拟 水
- 【Goodbye2014】Codeforces 500C New Year Book Reading【贪心+模拟】
- Codeforces Round #378 (Div. 2) C && Codeforces 733C (模拟)详解(两种写法)
- 【并查集】【模拟】Codeforces 698B & 699D Fix a Tree