18290 校赛排名2(sort函数)

这道题很有趣!

思路:判断当前队伍是否出现过,然后判断ac还是wa,关键在于每道题ac以及wa的表示,更重要的是把字母题号编写成数字序号,这样好写很多,因此要用一个数组用于标记ac题号,另一个数组用于wa题号

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct STU
{
    int time=0;
    int pass=0;
    char name[21];
    int acname[20];
    int fal[20];
};
struct STU stu[100000];
bool cmp(struct STU a,struct STU b)
{
    if(a.pass==b.pass)
    {
       return a.time<b.time;
    }
    else return a.pass>b.pass;
}

int main()
{
    int n=0,j,i,k=0,t,ifpass,min;
    char curname[21],title;

    while(scanf("%d %s %c %d",&min,curname,&title,&ifpass)!=EOF)
    {
    t=0;
        //printf("%d %s %c %d",min,curname,title,ifpass);
        for(i=0;i<=n-1;i++)
        {
            if(!strcmp(curname,stu[i].name))
            {
                t=1;break;
            }
        }
        if(!t)//如果t=0即这个队伍第一次露头
        {
            strcpy(stu[n].name,curname);
            i=n;//i指向这只新队伍,否则用之前找到重名的对应的i
            memset(stu[i].acname,0,sizeof(stu[i].acname));
            memset(stu[i].fal,0,sizeof(stu[i].fal));

        }


        if(!ifpass&&stu[i].acname[title-65]!=1)//通过而且不是之前ac过的题
        {
            stu[i].pass++;//ac题数加一
            stu[i].acname[title-65]=1;//标记为已通过
            stu[i].time+=stu[i].fal[title-65]*20+min;//之前这一题的罚时加上通过的当前时间
        }
        else if(ifpass)//没ac
        {
            stu[i].fal[title-65]++;
        }
        n++;

    }
    sort(stu,stu+n-1,cmp);

    for(i=0;i<=n-1;i++)
    {
        if(stu[i].pass) printf("%s %d %d\n",stu[i].name,stu[i].pass,stu[i].time);
        else break;
    }


    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值