UVa 10194 - Football (aka Soccer)

题目:给你一些球队的比赛记录,对球队的成绩进行排序。

分析:模拟。按照题意模拟即可。

            排序优先级:1.分数高 ,2.胜场多,3.净胜球多,4.进球多,5.比赛场次少,6.队名字典序。

注意:队名大小写不敏感,即大小写认为是相同的。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

char title[104],name[104];

typedef struct node
{
    char  word[32];
    int   point,games,wins,losses,scored,against;
}list;
list dict[32];

int small( char c ) 
{
	if ( c >= 'A' && c <= 'Z' )
		return c-'A'+'a';
	return c;
}


bool cmpstr( char* a,char* b )
{
	int now = 0;
	while ( small(a[now]) == small(b[now]) )
		now ++;
	return small(a[now]) < small(b[now]);
}

bool cmp( list a, list b )
{
	if ( a.point != b.point )
		return a.point > b.point;
	if ( a.wins != b.wins )
		return a.wins > b.wins;
	if ( a.scored-a.against != b.scored-b.against )
		return a.scored-a.against > b.scored-b.against;
	if ( a.scored != b.scored )
		return a.scored > b.scored;
	if ( a.games != b.games )
		return a.games < b.games;
	return cmpstr( a.word, b.word );
}

int find( char* word, int l, int n ) 
{
    for ( int i,j = 0 ; j < n ; ++ j ) {
        for ( i = 0 ; i < l ; ++ i )
        	if ( small(dict[j].word[i]) != small(word[i]) ) 
				break;
        if ( i == l ) return j;
    }return -1;
}

void deal( int T )
{
	int save = 0,s1,s2,t1,t2;
    while ( (name[save] = getchar()) != '#' ) 
		save ++;
	t1 = find( name, save, T );
			
	scanf("%d",&s1);
	getchar();
	scanf("%d",&s2);
	getchar();
			
	save = 0;
    while ( (name[save] = getchar()) != '\n' ) 
		save ++;
	t2 = find( name, save, T );
			
	dict[t1].games ++;
	dict[t1].scored += s1;
	dict[t1].against += s2;
	dict[t2].games ++;
	dict[t2].scored += s2;
	dict[t2].against += s1;
	if ( s1 > s2 ) {
		dict[t1].point += 3;
		dict[t1].wins ++;
		dict[t2].losses ++;
	}
	if ( s1 < s2 ) {
		dict[t2].point += 3;
		dict[t2].wins ++;
		dict[t1].losses ++;
	}
	if ( s1 == s2 ) {
		dict[t1].point ++;
		dict[t2].point ++;
	}
}
		
int main()
{
    int  N,T,G;
    scanf("%d",&N);
    getchar();
	while ( N -- ) {
		memset( dict, 0, sizeof(dict) );
		gets(title);
	    printf("%s\n",title);
	        
		scanf("%d",&T);
		getchar();
	    for ( int i = 0 ; i < T ; ++ i ) 
	        gets(dict[i].word);
	        
	    scanf("%d",&G);
	    getchar();
	    for ( int i = 0 ; i < G ; ++ i ) {
	        deal( T );
		}
	        
		sort( dict, dict+T, cmp );
		for ( int i = 0 ; i < T ; ++ i )
			printf("%d) %s %dp, %dg (%d-%d-%d), %dgd (%d-%d)\n",\
				i+1,dict[i].word,dict[i].point,dict[i].games,dict[i].wins,\
				dict[i].games-dict[i].wins-dict[i].losses,dict[i].losses,\
				dict[i].scored-dict[i].against,dict[i].scored,dict[i].against);

		if ( N ) printf("\n");
	}
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值