题意
题目大意是讲有若干个队伍参加两场比赛,其中一些队伍只参加了其中一场,每个队伍均有一个单独的ID(1-100).
比较出所有队伍最终排名.
example:
Contest1 | Contest2 | ||
---|---|---|---|
place | id | place | id |
1 | 9 | 1 | 3 |
2 | 7,1,4 | 2 | 5 |
5 | 5 | 3 | 1,10 |
6 | 15,8 | 5 | 6 |
8 | 31,18 | 6 | 9 |
10 | 17 | 7 | 19 |
8 | 4,20 | ||
10 | 21 |
排名要求:
- 如果 A 队在两场比赛中均胜过其他一些队伍,那么这个 A 队的最终排名一定比这些队伍排名高.
- 如果 A 队在第一场比赛表现胜过 B 队,在第二场不如 B 队,那么他们最终的排名根据两队在两场比赛中的排名差来判断.比如在比赛1中,1队的排名为2,5队的排名为5,胜差为3;在比赛2里,1队的排名为3,5队的排名为2,胜差为-1,总胜差为2.因此,最终排名1队高于5队.如果总胜差为0,那么他们最终的排名也相同,比如5队和9队.
- 如果 A 队参加了两场比赛,B 队伍只参加了比赛1,并且在比赛1中A 队和 B 队的排名相同,同时在这个排名的位置没有其他参加了两场比赛并且最终排名和 A 队不相同的队伍,那么他们的最终排名也相同.比如10队与1队的最终排名相同,另外虽然7队的排名和1队、4队相同,但是因为1、4队最终排名不相同,所以7队的最终排名无法确定.在比赛2中,6队虽然排名在5队和9队的中间,但是因为5队和9队的最终排名相同,所以6队的排名也不能确定.
- 对于只参加了一场比赛的队伍,则比较他们在比赛中与最终排名已经确定的队伍表现.比如3队.排名末尾的队伍,最终排名也为末尾,比如17和21队.
results:
final place | both contests | one contest only |
---|---|---|
1 | ||
2 | 1 | 10 |
3 | 5,9 | |
4 | 19 | |
5 | 4 | 20 |
6 | 8,15 | |
7 | 18,31 | |
8 | 17,21 |
分析
很明显,首先应该计算参加过两场比赛的队伍的最终排名,然后参加过一场比赛的队伍去比较排名已经确定的队伍,确定他们的最终排名.
为了方便排序,用了链表,先构建参加了两场比赛队伍的排名,然后遍历剩余队伍.只要不考虑掉情况,问题不大.
代码如下:
Memory: 816K Time: 79MS Length: 249LINES
#include <iostream>
#include <map>
#include <set>
#include <sstream>
#include <vector>
using namespace std;
const