原题
题意
一场有5道题的比赛
做出来5 4 3 2 1 0 的人分别得100 90 80 70 60 50分
并且除了满分和不及格,在当前做题数人数中,罚时排在当前做题数人数的前一半的人可以加5分
输出每个人最后的得分
思路
结构体排序,时间可以转化整数比较。因为要比较每个做题数中前一半的人数,所以需要记录每人的初始编号。还需要记录每个做题数区间的人数,来对满足‘’+5‘’的人加分。
挺简单的一题,做完后我觉得我仿佛是老了,wa了将近个2小时。。。数组越界,忽略i的自加,甚至注释忘了删除,心态爆炸,吐了吐了,提交之前一定得认真认真再认真!awsl
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100],f[110],c[100];//答题分数(不加5),最终结果,做出来i道题的人数
struct node
{
int sno; //编号
int num; //答题数
int grade;//分数
};
bool cmp(node x,node y)
{
if(x.num!=y.num)
return x.num>y.num;
if(x.grade!=y.grade)
return x.grade<y.grade;
return x.sno<y.sno;
}
int main()
{
a[5]=100;
int n,h,m,s;
for(int i=4;i>=0;i--)
a[i]=a[i+1]-10;
while(~scanf("%d",&n)&&n!=-1){
node b[110];
memset(f,0,sizeof(f));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
scanf("%d %d:%d:%d",&b[i].num,&h,&m,&s);
b[i].grade=h*3600+m*60+s;//对这种时间排序,有时候直接计算也挺方便
f[i]=a[b[i].num]; //赋处置,不加5
b[i].sno=i;
c[b[i].num]++;
}
sort(b+1,b+1+n,cmp);
for(int i=1;i<=n;i++){
if(b[i].num==5||b[i].num==0)
continue;
int l=c[b[i].num]/2,j=i;
while(l--)
f[b[j++].sno]+=5;
i=i+c[b[i].num]-1;//这个地方忘了-1,可wa死我了
}
for(int i=1;i<=n;i++)
printf("%d\n",f[i]);
printf("\n");
}
return 0;
}