一、热身 [Cloned] G - 请使用sort

原题:Football is one of the greatest games in the world. Lots of people like to play football. After one season of matches, the header has to calculate the last scores of every team. He is too lazy that he doesn't want to calculate, so he asks you to write a program for him to solve the problem. 

Here are the rules: 
1 Every team has to match with all the other teams. 
2 Every two teams have to match for two times,one at home and one away. 
3 In one match, the winner will get 3 points, the loser will get 0 point. If it is draw, both of them will get 1 point. 

题意:

输入几支球队的相互比赛的比分,求出各个球队的排名,遵循以下几个优先选择:

1.一场比赛胜利得3分,平局得一分,失败不得分,最后得分数作为第一排序元素

2.如果得分相同,则按照净胜球排序,及净胜球=进球数-失球数

3.如果净胜球数相同,则按照进球数排名

4.如果进球数相同,则按照球队名称字典序

题解:

1.创建一个结构体包括球队名称、进球数、失球数、得分数、净胜球数

2.按照以上四个原则写compare函数

3.另写一个函数来找到这个球队在数组中的位置以便进行操作,如果在数组中没找到这个球队还要初始化这个球队的信息

4.输入数据进行sort(A,A+n,compare),然后输出

代码:AC

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct node
{
	char name[60];
	int grade,win,lost,margin;
}node;
int num;
node data[1000];
bool compare(node a,node b)
{
	if(a.grade!=b.grade)
		return a.grade>b.grade;
	else if(a.margin!=b.margin)
		return a.margin>b.margin;
	else if(a.win!=b.win)
		return a.win>b.win;
	else
	{
		if(strcmp(a.name,b.name)==-1)
			return true;
		else
			return false;
	}
}

int find(char *a)
{
	int i;
	for(i=0;i<num;i++)
	{
		if(strcmp(a,data[i].name)==0)
			return i;
	}
	return -1;
}

int main()
{
	int n,grade1,grade2;
	char team1[60];
	char team2[60];
	while(cin>>n)
	{
		num=0;
		memset(data,0,sizeof(data));
		int sum=n*(n-1);
		char VS[5];
		int i;
		num=0;
		for(i=0;i<sum;i++)
		{
			scanf("%s %s %s %d:%d",team1,VS,team2,&grade1,&grade2);
			int t;
			t=find(team1);
			if(t==-1)
			{
				strcpy(data[num].name,team1);
				data[num].win=grade1;
				data[num].lost=grade2;
				data[num].margin=grade1-grade2;
				if(grade1>grade2)
					data[num].grade=3;
				else if(grade1==grade2)
					data[num].grade=1;
				num++;
			}
			else
			{
				data[t].win+=grade1;
				data[t].lost+=grade2;
				data[t].margin+=(grade1-grade2);
				if(grade1>grade2)
					data[t].grade+=3;
				else if(grade1==grade2)
					data[t].grade+=1;
			}
			t=find(team2);
			if(t==-1)
			{
				strcpy(data[num].name,team2);
				data[num].win=grade2;
				data[num].lost=grade1;
				data[num].margin=grade2-grade1;
				if(grade1<grade2)
					data[num].grade=3;
				else if(grade1==grade2)
					data[num].grade=1;
				num++;
			}
			else
			{
				data[t].win+=grade2;
				data[t].lost+=grade1;
				data[t].margin+=(grade2-grade1);
				if(grade1<grade2)
					data[t].grade+=3;
				else if(grade1==grade2)
					data[t].grade+=1;
			}
		}
		sort(data,data+n,compare);
		for(i=0;i<n;i++)
		{
			cout<<data[i].name<<" "<<data[i].grade<<endl;
		}
		cout<<endl;
	}
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值