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