uva 10194 Football (aka Soccer)

题意:给你比赛的情况,要你给出一个排名,排名先按积分高低,赢的次数多寡,赢的球减去输的球的值的高低,赢的球的多寡,打的比赛最少,最后按字典序输出(这里特别注意是不区间大小写的)。

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
struct node
{
    char name[40];
    int point,play,win,tie,lose,score,again;
    void fun(int a,int b)
    {
        play++;
        if(a>b){win++;point+=3;}
        else if(a==b) {tie++;point+=1;}
        else lose++;
        score+=a;   again+=b;
    }
}team[35];
bool cmp(const node &e1,const node &e2)
{
    if(e1.point!=e2.point) return e1.point>e2.point;
    else if(e1.win!=e2.win) return e1.win>e2.win;
    else if(e1.score-e1.again!=e2.score-e2.again) return e1.score-e1.again>e2.score-e2.again;
    else if(e1.score!=e2.score) return e1.score>e2.score;
    else if(e1.play!=e2.play) return e1.play<e2.play;
    else return strcasecmp(e1.name,e2.name)<0;
}
int main()
{
    int t,t_cnt=0;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        char game[105]={0},temp[40],str[1005];
        int n,m,d=0;
        map<string,int> adj;
        memset(team,0,sizeof(team));

        gets(game);
        scanf("%d",&n);
        getchar();
        for(int i=0;i<n;i++)
        {
            gets(temp);
            adj.insert(pair<string,int>(temp,++d));
            strcpy(team[d].name,temp);
        }
        scanf("%d",&m);
        getchar();
        for(int i=0;i<m;i++)
        {
            char name1[40]={0},name2[40]={0};
            int num1,num2;
            gets(str);
            sscanf(str,"%[^#]#%d@%d#%[^\n]",name1,&num1,&num2,name2);
            //printf("name1=%s,num1=%d,name2=%s,num2=%d\n",name1,num1,name2,num2);
            team[adj[name1]].fun(num1,num2);
            team[adj[name2]].fun(num2,num1);
        }
        sort(team+1,team+n+1,cmp);
        if(t_cnt!=0) puts("");  t_cnt++;
        puts(game);
        for(int i=1;i<=n;i++)
        {
            printf("%d) %s %dp, %dg (%d-%d-%d), %dgd (%d-%d)\n",i,
                   team[i].name,team[i].point,team[i].play,team[i].win,team[i].tie,
                   team[i].lose,team[i].score-team[i].again,team[i].score,team[i].again);
        }
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值