饶学学的比赛(模拟)

饶学妹的比赛

时间限制: 1 秒  内存限制: 64 MB
 
 
题目描述

饶学妹组织了一场ACM赛制的比赛,大家纷纷慕名来参加。比赛中大家交题只会有两种结果:AC,WA。比赛结束了,饶学妹制作榜单啦。首先按AC题目的数目(重复AC一道题只算一次)从多到少排名;AC题目数目相同的同学按罚时(罚时计算方式为:单题罚时 = (首次AC该题目时间 + 首次AC之前WA的次数 * 20) min,总罚时 = 各题罚时之和;即某题目AC之后,对这道题目后续的提交均不计入罚时)从少到多排列;AC数目相同且罚时也相同的同学,按编号从小往大排序。

输入


第一行为n,m,k(1≤n≤1000,1≤m≤10000,1≤k≤10),分别表示参加比赛的人数、提交总次数和总题数。
之后一行为n个用空格分隔的字符串,表示n位参赛选手的姓名(每个字符串长度均不超过20,且仅含小写字母);
之后m行,每行均为 Timei IDi PIDi Resulti,(1≤TimeiTimei+1≤300,1≤IDin,1≤PIDik,Resulti="AC"/"WA"),表示编号为IDi的选手在Timei时刻提交了编号为PIDi的题目,且结果为Resulti.


输出

输出n行,按排名从高到低排列。每行分别输出该选手的姓名,过题数,总罚时,中间均为一个空格间隔。

样例输入
5 11 10phx lsf zk rqy ch1 1 1 AC1 1 2 AC2 1 3 AC2 1 4 AC3 2 2 WA4 2 2 AC5 3 2 AC10 5 1 WA20 5 2 WA30 5 3 WA40 5 4 WA
样例输出

phx 4 6zk 1 5lsf 1 24rqy 0 0ch 0 0


题解:没有设么坑点就是,模拟,思维严谨点就行了,注意细节……




#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
#define ll long long
#define For(i,a,b) for(int i=a;i<b;i++)
#define sf(a)  scanf("%d",&a)
#define sfs(a)  scanf("%s",a)
#define sff(a,b)  scanf("%d%d",&a,&b)
#define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pf(a) printf("%d\n",a)
#define P()  printf("\n")
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node                     // 成员分别存储总罚时,解决题数,成员ID,每题WR几次,和姓名
{
    int score,num,a,ti[12];
    char b[20];
}x[1005];
int v[1005][12];
int cmp(node g,node h)
{
    if(g.num!=h.num)
    {
        return g.num>h.num;
    }
    else
    {
        if(g.score!=h.score)
        {
            return g.score<h.score;
        }
        else return g.a<h.a;
    }
}
int main()
{
    int n,m,k;
    sfff(n,m,k);
    For(i,1,n+1)
    {
        sfs(x[i].b);
        x[i].a=i;
    }
    int aa,bb,cc;
    char y[20];
    mem(v,0);
    For(i,0,m)
    {
        sfff(aa,bb,cc);
        sfs(y);
        if(!v[bb][cc])
        {
            if(strcmp(y,"AC")==0)
            {
                x[bb].score+=x[bb].ti[cc]*20+aa;
                x[bb].num++;
                v[bb][cc]=1;
            }
            else
            {
                x[bb].ti[cc]++;
            }

        }
    }
    sort(x+1,x+n+1,cmp);
    For(i,1,n+1)
    {
        printf("%s %d %d\n",x[i].b,x[i].num,x[i].score);
    }
}














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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值