ECNU 1829 发愁

ECNU 1829 发愁

链接

https://acm.ecnu.edu.cn/problem/1829

题目

单点时限: 2.0 sec

内存限制: 256 MB

大家来到小强家,发现小强正发愁,原来小强正为 “ACM 足球超级联赛 ” 的排名而发愁。

既然过生日,就应该开开心心的,所以作为超级程序员的你应当挺身而出!

所以请你,天才程序员帮下忙,写个程序根据比赛情况计算出各队排名。

输入格式
有多组测试数据。

每组数据先输入两个整数 n 和 m , 代表球队数量, 代表比赛场数。

接下来 m 行,每行有三个数 abc。 ab 表示球队的编号。

c=1 ,表示 ‘a 胜 b’;

c=-1 ,表示 ‘b 胜 a’;

c=0 ,表示 ‘a、b 战成平局’。

胜者球队积分加 3 分,负者球队积分扣 1 分,平局双方各加 1 分。

(输入不会有自己打自己的情况,两个队之间可能有多场比赛)

表示输入结束,不用处理这组数据。

每个球队的初始积分为0。

输出格式
在一行中按照排名输出各队的编号,每个数的后面输出一个空格,最后一个数后面没有空格。

排名规则:

1: 积分高的队排前面。

2: 积分一样的队胜场数多的排前面。

3: 积分一样且胜场数一样的队负场数少的排前面。

4: 若还不能分出先后,编号小的排前面。

样例
input
4 4
1 2 1
2 1 1
3 4 1
3 4 -1
4 1
1 3 -1
4 1
3 2 0
4 4
4 1 1
3 2 0
3 2 0
3 1 0
4 2
3 1 1
1 4 0
0 0
output
1 2 3 4
3 2 4 1
2 3 1 4
4 3 2 1
3 4 2 1

思路

也是个比较问题,就直接用类模拟一下,team里面有num是编号,winloss是胜败场次,score是分数,输入时注意,数组从0开始,编号从1开始,所以要-1,最后输出时候+1.
之后就是,优先比较分数,再比较胜场,再比较败场,最后比较编号即可。

代码

public static class Team {

    public int num;
    public int win;
    public int lose;
    public int score;

    public Team(int num) {
      this.num = num;
      this.win = 0;
      this.lose = 0;
      this.score = 0;
    }
  }

  public static void fun() {
    Scanner sc = new Scanner(System.in);
    while (sc.hasNextInt()) {
      int n = sc.nextInt();
      int m = sc.nextInt();
      if (n == 0 && m == 0) {
        return;
      }
      Team[] team = new Team[n];
      for (int i = 0; i < n; i++) {
        team[i] = new Team(i);
      }
      for (int i = 0; i < m; i++) {
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        a--;
        b--;
        if (c == 1) {
          team[a].win++;
          team[a].score += 3;
          team[b].lose++;
          team[b].score -= 1;
        } else if (c == -1) {
          team[b].win++;
          team[b].score += 3;
          team[a].lose++;
          team[a].score -= 1;
        } else {
          team[a].score++;
          team[b].score++;
        }
      }

      Arrays.sort(team, new Comparator<Team>() {
        @Override
        public int compare(Team o1, Team o2) {
          if (o1.score != o2.score) {
            return o2.score - o1.score;
          } else if (o1.win != o2.win) {
            return o2.win - o1.win;
          } else if (o1.lose != o2.lose) {
            return o1.lose - o2.lose;
          } else {
            return o1.num - o2.num;
          }
        }
      });

      for (int i = 0; i < n; i++) {
        System.out.print(team[i].num + 1);
        if (i != n - 1) {
          System.out.print(" ");
        }
      }
      System.out.println();
    }
  }
原文地址:https://www.cnblogs.com/blogxjc/p/14309324.html