HDU 1084 What Is Your Grade?(排序)

  • 题目在这里:1084

  • 题目描述:
    “Point, point, life of student!”
    This is a ballad(歌谣)well known in colleges, and you must care about your score in this exam too. How many points can you get? Now, I told you the rules which are used in this course.
    There are 5 problems in this final exam. And I will give you 100 points if you can solve all 5 problems; of course, it is fairly difficulty for many of you. If you can solve 4 problems, you can also get a high score 95 or 90 (you can get the former(前者) only when your rank is in the first half of all students who solve 4 problems). Analogically(以此类推), you can get 85、80、75、70、65、60. But you will not pass this exam if you solve nothing problem, and I will mark your score with 50.
    Note, only 1 student will get the score 95 when 3 students have solved 4 problems.
    I wish you all can pass the exam!
    Come on!

  • 题意分析:
    有五道题,满分是100分,做出5道就是100,4道90,3道80,2道70,1道60,一道都没做出来就是50分。如果你处于和你做出同样多的题目数的人的前一半,那么就可以多拿5分,做出5道题和0道题的同学不在此列。

  • 我的思路:
    记录时间,按照时间降序排列,但是要按照原来的顺序输出分数,所以需要一个数组来记录原来的顺序,不能在原来的数据上直接进行排序,一开始我没有考虑到这个,吃了WA。还有一个问题,考虑到如果是只有一个人,或者好几个人花同样的时间做出了同样的时间,后者可以按照原来的规则来,一个人就再写一个判断就行。
    虽然看discuss,好像没有这样的数据。w(゚Д゚)w
    最后采用一个二维数组来存储做同样多道题的人数和记录原本的顺序,a[5][105],
    比如a[1][0],就是只做出一道题的人数,假如有5个人,那么a[1][1]–a[1][5]就可以保存他们原来的顺序。

  • 完整代码

#include<iostream>
#include<string.h>

using namespace std;
typedef struct student
{
    char time[15];          //消耗时间
    int score;              //分数
}student;
student stu[105];
int main()
{
    int i, j, k, n, temp, tt;
    int a[5][105];              //用于记录做题人数和做题顺序
    while (cin >> n)      //学生数目n
    {
        if (n <= 0) break;
        memset(a, 0, sizeof(int) * 5 * 105);    //归零
        for (i = 1; i <= n; i++)
        {
            cin >> temp >> stu[i].time;     //题目数以及消耗时间
            stu[i].score = 50 + temp * 10;
            if (temp>0 && temp<5)
            {
                a[temp][0]++;               //做出同样题目数目的人
                tt = a[temp][0];            //为了标记顺序
                a[temp][tt] = i;            //记录做出这道题的人的顺序
            }
        }
        for (i = 1; i<5; i++)           //做出题目数目从1到4
        {
            for (j = 2; j <= a[i][0]; j++)
            {
                for (k = 2; k <= a[i][0] + 2 - j; k++)
                {
                    if (strcmp(stu[a[i][k - 1]].time, stu[a[i][k]].time) > 0)       //按照时间大小降序排列
                    {
                        swap(a[i][k - 1], a[i][k]);
                    }
                }
            }
            for (j = 1; j <= a[i][0] / 2; j++)
                stu[a[i][j]].score += 5;
        }
        for (i = 1; i <= n; i++)
            cout << stu[i].score << endl;
        cout << endl;
    }
    return 0;
}

转载于:https://www.cnblogs.com/FlyerBird/p/9052570.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值