题目如下:
比赛情况统计
有一个游戏平台,各个参赛队伍(以唯一的TeamID来标识)之间进行单循环的对抗赛,两个队伍之间只举行一场比赛,比赛以得分的多少定胜负。需要完成一个统计赛况的程序,能够随时查询指定队伍的最新赛况:包括胜、平、负的局数,当前总积分以及名次。
说明:循环赛没有全部结束时也可以查询某个队伍的最新赛况
规则说明
比赛判定:两个队伍中得分高的一方为胜者,另一方为负者;得分相同则为平局
积分规则:每一局比赛: 胜者积3分;平局双方各积1分; 负者积0分
排名规则:按照当前总积分的高低,名次从1开始依次进行排名。积分相同的名次并列,出现n(n>=2)个队伍名次并列时,则并列名次的以下n-1个名次空出
输入满足如下规格或约束,考生程序无需检查:
(1)比赛队伍总数<=1000<>
(2)0 <= teamid<= 65535<>
(3)每个队伍的总积分<=65535<>
(4)队伍1对队伍2的比赛, 队伍2对队伍1的比赛指同一场比赛
(5)不会重复输入同一场比赛的比赛结果
(6)自己和自己不比赛
循环赛的前两场比赛结果如下:
| 队伍1ID | 队伍1得分 | 队伍2ID | 队伍2得分 |
比赛1 | 1 | 34 | 2 | 45 |
比赛2 | 2 | 40 | 3 | 40 |
输入:
队伍相互比赛信息,格式是队伍id和得分,如1 2 34 45 ,就是ID为1和2的两个队伍的比赛得分是34与45.一个队赛况结果内的数据用空格隔开;
输出:
以名次去排列的得分情况,依次是
队伍ID | 胜的场数 | 平局场数 | 负的场数 | 总积分 | 名次 |
2 | 1 | 1 | 0 | 4 | 1 |
那么就是 211041
测试样例:
输入:1 2 34 45 2 3 4040 1 3 35 45
输出:1 0 0 2 0 3 2 1 10 4 1 3 1 1 0 4 1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Main test = new Main();
Scanner in = new Scanner(System.in);
String string = in.nextLine();in.close();
in = new Scanner(string);
int t1,t2,s1,s2;
while(in.hasNext()){
t1 = in.nextInt();t2=in.nextInt();s1 = in.nextInt();s2 = in.nextInt();
test.ids.add(t1);test.ids.add(t2);
test.addTeam(t1, t2, s1, s2);
}
in.close();
test.display();
}
public void display(){
int r = 1;
TeamNode tmp = ranks.get(0);
if(tmp==null) return;
tmp.rank = r;
for(int i=1;i<ranks.size();i++){
if(ranks.get(i).points<tmp.points){
r = i+1;
}
ranks.get(i).rank = r;
}
int ttt =0;
for (int t : ids) {
tmp = teams.get(t);
if(ttt==teams.size()-1){
System.out.print(tmp.id+" "+tmp.wins+" "+tmp.draws+" "+
tmp.losses+" "+tmp.points+" "+tmp.rank);
}else{
System.out.print(tmp.id+" "+tmp.wins+" "+tmp.draws+" "+
tmp.losses+" "+tmp.points+" "+tmp.rank+" ");
}
ttt++;
}
}
public void addTeam(int id1,int id2,int score1,int score2){
TeamNode node1=null,node2=null;
if(teams.containsKey(id1)){
node1 = teams.get(id1);
}else{
node1 = new TeamNode(id1);
}
if(teams.containsKey(id2)){
node2 = teams.get(id2);
}else{
node2 = new TeamNode(id2);
}
if(score1==score2){
node1.draws++;node2.draws++;
if(node1.points==-1){
node1.points = 1;
teams.put(id1, node1);
}else{
node1.points++;
}
if(node2.points==-1){
node2.points = 1;
teams.put(id2, node2);
}else{
node2.points++;
}
rerankTeam(node1);
rerankTeam(node2);
}else if(score1>score2){
node1.wins++; node2.losses++;
if(node1.points==-1){
node1.points = 3;
teams.put(id1, node1);
}else{
node1.points +=3;
}
if(node2.points==-1){
node2.points = 0;
teams.put(id2, node2);
node2.index = ranks.size();
ranks.add(node2);
}
rerankTeam(node1);
}else{
node1.losses++; node2.wins++;
if(node1.points==-1){
node1.points = 0;
teams.put(id1, node1);
node1.index = ranks.size();
ranks.add(node1);
}
if(node2.points==-1){
node2.points = 3;
teams.put(id2, node2);
}else{
node2.points+=3;
}
rerankTeam(node2);
}
}
public void rerankTeam(TeamNode id){
int t = id.index;
int i=0;
if(t==-1) t = ranks.size();
for(i=t-1;i>=0;i--){
if(ranks.get(i).points > id.points){
break;
}
}
if(id.index != -1){
ranks.remove(id.index);
}
id.index = ++i;
ranks.add(i,id);
}
private HashMap<Integer, TeamNode> teams= new HashMap<Integer, TeamNode>();
private ArrayList<TeamNode> ranks = new ArrayList<TeamNode>();
public TreeSet<Integer> ids = new TreeSet<>();
}
class TeamNode{
public int id;
public int wins; //胜利次数
public int draws; //平次数
public int losses; //输的次数
public int points;
public int index;
public int rank;
public TeamNode(int id){
this.id = id;this.points = -1;
wins = 0;draws=0;losses=0;this.index=-1;
}
}