您的位置:首页 > 其它

排序系列 poj2379

2013-08-07 13:42 99 查看
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int team;
int pro_nums;
int time;
bool ac[21];
int wa[21];
}Team;
typedef struct
{
int ci,pi,ti,ri;
}Input;
int cmp(const void * a ,const void *b)
{
Team *c = (Team *)a;
Team *d = (Team *)b;
if(c->pro_nums != d->pro_nums)
return d->pro_nums - c->pro_nums;
else if (c->time!=d->time)
return c->time - d->time;
return c->team - d->team;
}
int cmp2(const void * a ,const void * b)
{
return (*(Input *)a).ti - (*(Input *)b).ti;
}
int main()
{
int C,N,i,j,teamhash[1005],ci,pi,ti,ri,k=0,index;
Team t[1005];
Input in[1005];
scanf("%d%d",&C,&N);
memset(teamhash,-1,sizeof(teamhash));
memset(t,0,sizeof(t));
for (i=0;i<N;i++)
{
scanf("%d%d%d%d",&ci,&pi,&ti,&ri);
in[i].ci = ci;
in[i].pi = pi;
in[i].ti = ti;
in[i].ri = ri;
//if (t[index].ac[i]==false)
// t[index].time += ti;
}
qsort(in,N,sizeof(Input),cmp2);
for (i=0;i<N;i++)
{
ci = in[i].ci;
pi = in[i].pi;
ti = in[i].ti;
ri = in[i].ri;
if (teamhash[ci]==-1)
teamhash[ci] = k++;
index = teamhash[ci];
t[index].team = ci;
if (ri)
{
if (t[index].ac[pi]==false) //第一次ac
{
t[index].pro_nums ++;
t[index].time += ti + t[index].wa[pi]*1200;
t[index].ac[pi] = true;
}
}
else
{
if (t[index].ac[pi]==false)
t[index].wa[pi] ++;
}
}
for (i=1;i<=C;i++)
if (teamhash[i]==-1)
t[k++].team = i;
qsort(t,C,sizeof(Team),cmp);
for (i=0;i<C-1;i++)
printf("%d ",t[i].team);
printf("%d\n",t[i].team);
return 0;
}


此题没什么技巧,只是注意的细节很多;容易WA的地方的有以下几点:
1、输入的提交序列没有顺序可言,早提交的晚提交的顺序可以颠倒,所以要先将序列按照时间排序

2、AC了之后再有同一道题的提交均忽略

3、WA要罚时,单位是minutes,输入的时间是seconds
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: