What Is Your Grade?(结构体排序)

原题

在这里插入图片描述
2

题意

一场有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;
}
发布了85 篇原创文章 · 获赞 10 · 访问量 5226

猜你喜欢

转载自blog.csdn.net/riversuer/article/details/105422346