SCAU 计算智能 18290 校赛排名2

Description
下面是校赛的排名规则:
比赛期间,提交代码后,系统会返回正确或错误等结果。最后的获胜者为正确解答题目最多,
如果同题数则总用时最少的队伍。
每道试题的时间花费将从竞赛开始到试题提交并且被判定为正确为止,
其间每一次提交运行结果被判错误的话将被加罚20分钟时间,
未正确解答的试题不记时,如果已经返回正确的题目再重复提交则不影响结果。

例如:
A、B两队都正确完成两道题目,其中A队提交这两题的时间分别是比赛开始后60分钟和165分钟,
B队为80分钟和130分钟,但B队第一个题提交了2次才通过。
这样A队的总用时为60+165=225而B队为(80+20)+130=230,所以A队以总用时少而获胜。
现在给出裁判机上面所有队伍的提交时间(分钟数)和返回结果,需要你编程输出当前比赛的排行榜。

注:0题的队伍不需要输出

输入格式
每行一个评判结果
格式为:时间(第几分钟提交的)+半角空格+队名+半角空格+题号+半角空格+评判结果(0通过,其它为出错)

题号由大写A字符开始,第2题是B,依次类推,最多不超过15题
所有评判结果已经按时间排序好

输出格式
输出排名,一行一个,格式为队名+半角空格+通过题数+半角空格+罚时

注:0题的队伍不需要输出
测试数据中,没有同题且同罚时的情况

输入样例
2 abc A 4
5 abc B 0
6 def A 0
10 abc A 0
13 xyx A 4
20 def B 5

输出样例
abc 2 35
def 1 6

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>

using namespace std;

struct team
{
    char name[22];//队名
    int pass;//通过题数
    int correct[20];//通过的题目,题号作为数组下标
    int error[20];//错误的题目,题号作为数组下标,存放做错的次数
    int time;//总罚时
    int val;//按照读取的先后顺序输出
};

team teams[1000]= {{0}};

//输出排序
bool compare(team a,team b)
{
    if(a.pass!=b.pass)
        return a.pass>b.pass;
    if(a.time!=b.time)
        return a.time<b.time;
    return a.val<b.val;
}

int main()
{
    int nowtime; //提交时间
    char teamname[22]; //队名
    char questionname; //提交题号
    int result; //提交结果
    int flag; //有无这个队伍
    int num=0; //当前队伍数量
    int i;
    while((scanf("%d%*c%s%*c%c%*c%d",&nowtime,teamname,&questionname,&result))>0)
    {
        flag=0;
        for(i=0; i<num; i++)
        {
            if(strcmp(teams[i].name,teamname)==0)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)//无这个队伍
        {
            strcpy(teams[i].name,teamname);
            num=num+1;
            teams[i].val=i;
            //把该队伍通过题目和错误题目的数组全部置为0
            memset(teams[i].correct,0,sizeof(teams[i].correct));
            memset(teams[i].error,0,sizeof(teams[i].error));
            /*
            cout<<"队伍名字"<<teams[i].name<<endl;
            cout<<"通过题数"<<teams[i].pass<<endl;
            cout<<"总罚时"<<teams[i].time<<endl;
            cout<<"通过记录"<<teams[i].correct[questionname-65]<<endl;
            cout<<"错误记录"<<teams[i].error[questionname-65]<<endl;
            */
        }
        if(result==0&&teams[i].correct[questionname-65]!=1) //题目通过并且之前没有正确提交
        {
            teams[i].pass++;
            teams[i].correct[questionname-65]=1; //记录
            teams[i].time=teams[i].time+teams[i].error[questionname-65]*20+nowtime; //记得累加之前的时间
            /*
            cout<<endl;
            cout<<"队伍名字"<<teams[i].name<<endl;
            cout<<"通过题数"<<teams[i].pass<<endl;
            cout<<"总罚时"<<teams[i].time<<endl;
            cout<<"通过记录"<<teams[i].correct[questionname-65]<<endl;
            cout<<"错误记录"<<teams[i].error[questionname-65]<<endl;
            */
        }
        else if(result!=0)
        {
            teams[i].error[questionname-65]++;
            /*
            cout<<endl;
            cout<<"队伍名字"<<teams[i].name<<endl;
            cout<<"通过题数"<<teams[i].pass<<endl;
            cout<<"总罚时"<<teams[i].time<<endl;
            cout<<"通过记录"<<teams[i].correct[questionname-65]<<endl;
            cout<<"错误记录"<<teams[i].error[questionname-65]<<endl;
            */
        }
    }
    sort(teams,teams+num,compare);
    for(i=0; i<num; i++)
    {
        if(teams[i].pass!=0)
        {
            cout<<teams[i].name<<" "<<teams[i].pass<<" "<<teams[i].time<<endl;
        }
    }
    return 0;
}

参考原文

18290 校赛排名2(sort函数)_WAWA战士的博客-CSDN博客_scau校赛排名2这道题很有趣!思路:判断当前队伍是否出现过,然后判断ac还是wa,关键在于每道题ac以及wa的表示,更重要的是把字母题号编写成数字序号,这样好写很多,因此要用一个数组用于标记ac题号,另一个数组用于wa题号#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;...https://blog.csdn.net/weixin_45670020/article/details/105011765?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165331573816780357273384%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165331573816780357273384&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-105011765-null-null.142^v10^pc_search_result_control_group,157^v8^control&utm_term=18290+%E6%A0%A1%E8%B5%9B%E6%8E%92%E5%90%8D2&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值