Uva 10258 Contest Scoreboard

题目大意:给你1-100的部分或者全部参赛队伍的对于题目1-9的提交信息,让你输出排名。

排名规则如下:

先按照做出题目数量排序,如果做题量一样,按照总用时排序,总用时是 做出该题的时间距离比赛开始的分钟数+该题正确之前的错误提交次数*20;如果总用时一样,按照队伍ID小的排在前面,如果该题最终未解决,该题不计罚时。你的程序应统计出至少提交一次的队伍。

输入规则如下:

输入第一行包含一个整数,表示测试数据的组数,接下来是一个空行,以后每两行测试数据间均用一个空行隔开;

每组测试数据的每一行包括三个数和一个字母,按队伍,题目,时间,状态顺序排列,状态为C,I,R,U,E,分别代表正确,错误,答疑请求,未测评,违规提交,后三种情况对评分无影响,输入数据按照收到顺序排列。

输出规则如下:

对每组测试数据,输出一个计分板,每行包含队伍ID,解出题目数,总用时;

相邻两组数据的输出之间应有一个空行隔开。

 

这道题其实不难,但是有几个坑点。

1.一个题目若被某队正确提交过,再错误提交的时候是不计罚时的;

2.每两组输出数据之间要有一个空行隔开,言外之意只有一组测试数据的话就不用输出空行;

3.每组测试数据的输入行数不定,因此用字符串输入要处理好;

4.对于getchar()的用法;

5.就是排序函数的构造;

6.对于有提交但没对的队伍应输出来;

代码如下:

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

int mark[105][11];//标记该队是否已经解决该题
int fashi[105][11];//标记该队解决该题之前的错误提交次数
int yb[105];//统计该队是否提交过
struct node{
int team;
int score;
int ti;
node():team(0),score(0),ti(0){};//结构体初始化
}he[105];
bool cmp(node a,node b)//排序函数
{
    if(a.ti!=0&&b.ti!=0)
    {
        if(a.ti!=b.ti) return a.ti>b.ti;
        else if(a.score!=b.score) return a.score<b.score;
        else  return a.team<b.team;
    }
    else if(a.ti==0&&b.ti==0)
        return a.team<b.team;
    else
        return a.ti>b.ti;
}
void init()//初始化
{
    memset(mark,0,sizeof(mark));
    memset(fashi,0,sizeof(fashi));
    memset(yb,-1,sizeof(yb));
    for(int A=0;A<105;A++)
    {
        he[A].team=0;
        he[A].score=0;
        he[A].ti=0;
    }
}
int main()
{
    int n,k;
    scanf("%d",&n);getchar();//此处getchar吸收scanf后的回车
    for(k=1;k<=n;k++)
    {
        init();
        if(k>1) printf("\n");//如果K>1,说明多组测试数据
        int cnt=0,a,b,c;
        char d[3],str[20];
        if(k==1)//只有第一次输入时输入一个换行,此处getchar吸收这个换行,必须加k==1
            getchar();
        while(gets(str)!=NULL&& strcmp(str, ""))//处理输入的字符串,如果为空输入结束,开始处理
        {                                    // strcmp(str, "")作用判断是否为空,NULL判断是否文件结束  
            int len=strlen(str),x=0;
            d[0]=str[len-1];
            a=b=c=0;
			for(int i = 0; i < len - 1; i++)
			{
				if(str[i] >= '0' && str[i] <= '9')
					x = x * 10 + str[i] - '0';
				else
				{
					if(!a) a= x;
					else if(a&&!b) b=x;
					else if(a&&b) c=x;
					x=0;
				}
			}
			int T=a;
            if(yb[a]==-1) {yb[a]=cnt;cnt++;}
            a=yb[a];
            he[a].team=T;
            if(d[0]=='C'&&mark[a][b]==0)
             {
                 he[a].score+=(fashi[a][b]*20+c);
                 he[a].ti++;
                 mark[a][b]=1;
             }
             else if(d[0]=='I'&&mark[a][b]==0)
                 fashi[a][b]++;
        }
        sort(he,he+cnt,cmp);
        for(int j=0;j<cnt;j++)
            printf("%d %d %d\n",he[j].team,he[j].ti,he[j].score);
    }
    return 0;
}


 

只想说,水题不水。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值