华为OJ训练题之 比赛情况统计

题目如下:

比赛情况统计

有一个游戏平台,各个参赛队伍(以唯一的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


闯关的时候,碰到这题,google了一下,发现有一个程序,下来一跑发现结果不对。然后提交了好几次,终于搞定了。

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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值