样例:
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
struct sub{ 声明结构体 //
int ci,pi,ti,ri; //队号,题数,罚时,ac
}s[1100];
struct team{ // 声明结构体
int id; //队号
int num; // 题数
int tal_time; //罚时
int times[30]; //提交次数
int ac[30]; //是否ac
}t[1100];
bool cmp1(sub a,sub b){ // 按照罚时升序排列
return a.ti<b.ti;
}
bool cmp2(team a,team b){ //如果数量不相等按照题数降序排列
if(a.num!=b.num)
return a.num>b.num;
if(a.tal_time!=b.tal_time) //如果罚时不相等,按照罚时升序排列。
return a.tal_time<b.tal_time;
return a.id<b.id; //按照队伍id排序升序
}
int main() //主函数
{
int c,n;
int i,j;
while(scanf("%d%d",&c,&n)!=EOF){
for(i=1;i<=c;++i){ //将id num等初始化为零
t[i].id=i;
t[i].tal_time=0;
t[i].num=0;
memset(t[i].times,0,sizeof(t[i].times)); memset函数用来将数组初始化为零
memset(t[i].ac,0,sizeof(t[i].ac));
}
for(i=0;i<n;++i){!
scanf("%d%d%d%d",&s[i].ci,&s[i].pi,&s[i].ti,&s[i].ri); //输入变量
}
sort(s,s+n,cmp1); //按照cmp1调用快排
for(i=0;i<n;++i){
if(!(t[s[i].ci].ac[s[i].pi])){ 如果t[s[i].ci].ac[s[i].pi]!=1
if(!s[i].ri){ 如果s[i].ri!=1;
t[s[i].ci].times[s[i].pi]++; 提交次数+1;
}else{
t[s[i].ci].tal_time+=s[i].ti+t[s[i].ci].times[s[i].pi]*20*60; 计算罚时的总时间
t[s[i].ci].ac[s[i].pi]=1; 通过ac
t[s[i].ci].num++; 做出来的题数+1;
}
}
}
sort(t+1,t+c+1,cmp2); 调用cmp2快排
for(i=1;i<=c;++i){
if(i!=1)
printf(" ");
printf("%d",t[i].id); 输出结果。
}
printf("\n");
}
return 0;
}
总结“:
关于一些问题的处理.计算罚时数。如果一道题ac了过后,再提交一个错误的代码不计罚时.如果队伍存在排名相等的,则按照队伍号的升序排列.需注意的就是罚时的计算.