HDU 2094 产生冠军

作者: itbird01 | 来源:发表于2021-11-23 07:14 被阅读0次

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();
    }
}

相关文章

网友评论

    本文标题:HDU 2094 产生冠军

    本文链接:https://www.haomeiwen.com/subject/xffutrtx.html