Language:Default ACM Rank Table
Description ACM contests, like the one you are participating in, are hosted by the special software. That software, among other functions, preforms a job of accepting and evaluating teams' solutions (runs), and displaying results in a rank table. The scoring rules are as follows:
Your task is, given the list of N runs with submission time and result of each run, compute the rank table for C teams. Input Input contains integer numbers C N, followed by N quartets of integes ci pi ti ri, where ci -- team number, pi -- problem number, ti -- submission time in seconds, ri -- 1, if the run was accepted, 0 otherwise. Output Output must contain C integers -- team numbers sorted by rank. Sample Input
Sample Output
|
个人吐槽:很坑的一道题,有没有!
/*
这道题需要注意的是:
a.一次都没有提交过的队伍
b.已经WA了的
c.罚时一个是分一个是秒
d.不是按时间顺序给的
*/
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int N,C;
struct node1
{
int c1,flag[1005],t[1005],numbers,times;
}a[10005];
struct node2
{
int ci,ti,pi,ri;
}b[10005];
bool cmp1(node2 x,node2 y)
{
return x.ti<y.ti; //先按时间顺序排列
}
bool cmp2(node1 x,node1 y)//三层排序
{
if(x.numbers!=y.numbers)//第一层:通过题数多的在前
return x.numbers>y.numbers;
else if(x.times!=y.times)//第二层:通过题数相同:用时少的在前
return x.times<y.times;
else//第三层:题数、时间相同时,队列编号小的在前
return x.c1<y.c1;
}
int main()
{
scanf("%d%d",&C,&N);
for(int i=1;i<=C;i++)//对结构体node1数据初始化
{
memset(a[i].flag,0,sizeof(a[i].flag));
memset(a[i].t,0,sizeof(a[i].t));
a[i].numbers=a[i].times=0;
a[i].c1=i;
}
for(int i=1;i<=N;i++)
scanf("%d%d%d%d",&b[i].ci,&b[i].pi,&b[i].ti,&b[i].ri);
sort(b+1,b+N+1,cmp1);//时间排序
for(int i=1;i<=N;i++)
{
int c2=b[i].ci;
int p2=b[i].pi;
int t2=b[i].ti;
int r2=b[i].ri;
if(a[c2].flag[p2])continue;//已经AC过
if(r2)//不是一次AC
{
a[c2].flag[p2]=1;//标记
a[c2].numbers++;//通过题数+1
a[c2].times+=t2+a[c2].t[p2];//罚时加第一次AC提交的时间
}
else//WA
a[c2].t[p2]+=1200;//加二十分钟罚时
}
sort(a+1,a+C+1,cmp2);//三层排序
for(int i=1;i<=C;i++)printf("%d%c",a[i].c1,i==C?'\n':' ');
return 0;
}