/**
* poj2379 排序
* 这个题算是一个比较简单的排序,但是题目的意思比较模糊,需要重新总结一下才比较清楚
* 我最开始对于ti的理解是有误的,我以为ti是一次题目运行的时间,实际上不是,ti是本次提交的时间,是它反映着多次记录之间的顺序
* 主要的纠结点在于时间的统计,题目的真实意思是,一道题目如果没能AC,则不计入时间统计,如果AC了,这道题的时间为,第一次AC所用的时间+(1200*第一次AC之前失败的次数)
* 明确题义以后我的做法就比较简单了,首先对所有记录进行排序,ci升序>pi升序>ri降序(1先0后)>ti升序(方便确定顺序)
* 排序完成后统计各team的解决题目的个数和所用的时间,然后按题目数降序>时间升序>队号升序的原则排序,输出队号就可以了
*/
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
struct record{
int ci;
int pi;
int ti;
int ri;
}r[1001];
struct team{
int team_number;
int solved_number;
long long time_used;
team(){
solved_number = 0;
time_used = 0;
}
}t[1001];
int record_cmp(const void* a, const void* b){
record *p1 = (record*)a, *p2 = (record*)b;
//team_number(ci)升序
if(p1->ci != p2->ci){
return p1->ci - p2->ci;
}
//problem number(pi)升序
else if(p1->pi != p2->pi){
return p1->pi - p2->pi;
}
//是否通过标志位(ri)降序
else if(p1->ri != p2->ri){
return p2->ri - p1->ri;
}
//输入时间升序
else{
return p1->ti - p2->ti;
}
}
int team_cmp(const void* a, const void* b){
team *p1 = (team*)a, *p2 = (team*)b;
//solved_num降序
if(p1->solved_number != p2->solved_number){
return p2->solved_number - p1->solved_number;
}
//time_used升序
else if(p1->time_used != p2->time_used){
return p1->time_used - p2->time_used;
}
//team_number升序
else{
return p1->team_number - p2->team_number;
}
}
int main(){
int c,n;
scanf("%d%d",&c,&n);
for(int i=1;i<=n;++i){
scanf("%d%d%d%d",&r[i].ci,&r[i].pi,&r[i].ti,&r[i].ri);
}
qsort(r+1,n,sizeof(record),record_cmp);
for(int i=1;i<=c;++i){
t[i].team_number = i;
}
int team_counter = 0;
int tmp_team,tmp_prob,first_ac;
for(int i=1;i<=n;){
tmp_team = r[i].ci;
while(r[i].ci == tmp_team && i<=n){
tmp_prob = r[i].pi;
//若该题被解出,那么解题数+1,耗时自增ac的第一题的时间后,记录ac第一题的位置,将位置之前未ac的题目耗时再加1200进总时间
if(r[i].ri == 1){
t[tmp_team].solved_number++;
t[tmp_team].time_used += r[i].ti;
first_ac = r[i].ti;
while(r[i].ci == tmp_team && r[i].pi == tmp_prob && r[i].ri == 1 && i<=n){
i++;
}
while(r[i].ci == tmp_team && r[i].pi == tmp_prob && r[i].ri == 0 && r[i].ti < first_ac && i<=n){
t[tmp_team].time_used += 1200;
i++;
}
}
//若该题未被解出,那么直接进入到下一题
else{
while(r[i].ci == tmp_team && r[i].pi == tmp_prob && i<=n){
i++;
}
}
}
team_counter++;
}
qsort(t+1,c,sizeof(team),team_cmp);
printf("%d",t[1].team_number);
for(int i=2;i<=c;++i){
printf(" %d",t[i].team_number);
}
printf("\n");
return 0;
}
poj2379 排序
最新推荐文章于 2020-02-03 14:18:45 发布