HDU 2094 产生冠军
题意:有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
解题思路
1.分析题意可知,其实最终结果,就是判断是否有唯一的最终胜者
2.声明两个数据结构,分别用于存储胜者队伍、败者队伍,用hashset存储(之所以用hashset存储,是因为借助其不可重复性质)
3.对于每组输入的数据,a 、b只需做判断
1)如果a已在败者队伍,则将b也加入败者队伍,同时a、b都从胜者队伍移除
2)如果a不在败者队伍,则将a加入胜者队伍,同时将b加入败者队伍,同时从胜者队伍中移除b
4.最终判断,胜者队伍size是否为1
解题遇到的问题
1.理解题意,掌握一条铁律,一个人只能存在与唯一队伍中,即非胜即败
2.用到了hashset的特性,hashset,不管add、remove,元素存在时,不会重复添加,元素不存在时,移除也会失败
后续需要总结学习的知识点
无
##解法
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
if (n == 0) {
break;
}
// 声明两个数据结构,分别用于存储胜者队伍、败者队伍
HashSet<String> successList = new HashSet<String>();
HashSet<String> failList = new HashSet<String>();
while (n > 0) {
String a = scanner.next();
String b = scanner.next();
if (failList.contains(a)) {
failList.add(b);
successList.remove(a);
successList.remove(b);
} else {
successList.add(a);
successList.remove(b);
failList.add(b);
}
n--;
}
if (successList.size() == 1) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
scanner.close();
}
}
网友评论