HDOJ 1084 排序 水

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1084

不多说了,直接贴代码。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

class Student
{
public:
    //P是解出的题数,T是使用的时间
    int P, T;
    //sid是学生在输入序列中的序号
    int sid;
    //score是学生最后的成绩
    int score;
};

vector<Student> students;
//统计解出各题数的学生的人数
int stats[6];

//使分高的在前面
int cmp1(const Student &s1, const Student &s2)
{
    if (s1.P != s2.P)
        return s1.P > s2.P;
    return s1.T < s2.T;
}

//按在输入序列中的顺序由小到大排序
int cmp2(const Student &s1, const Student &s2)
{
    return s1.sid < s2.sid;
}

int main ()
{
    //N是学生数
    int N;
    while (scanf("%d",&N) != -1)
    {
        if (N < 0)
            break;
        students.clear();
        memset(stats, 0, sizeof(stats));
        for (int i = 1;i <= N;i ++)
        {
            Student aStudent;
            int hour, minute, second;
            scanf("%d%d:%d:%d", &aStudent.P, &hour, &minute, &second);
            //解出aStudent.P个题的学生数+1
            stats[aStudent.P] ++;
            //先给每个学生该档次的较低分
            aStudent.score = 100 - (5 - aStudent.P) * 10;
            aStudent.T = hour * 10000 + minute * 100 + second;
            aStudent.sid = i;
            students.push_back(aStudent);
        }
        sort(students.begin(), students.end(), cmp1);
        //对解出1题~4题的学生,调整其分数
        int pos = 0;
        for (int i = 4;i >= 1;i --)
        {
            pos += stats[i + 1];
            //给该分数段按做题时间由小到大排序前半部分的学生分数+5
            for (int j = 0;j < (stats[i] / 2);j ++)
                students[pos + j].score += 5;
        }
        sort(students.begin(), students.end(), cmp2);
        for (int i = 0;i < N;i ++)
            printf("%d\n",students[i].score);
        printf("\n");
    }
    return 0;
}
posted @ 2012-08-30 20:58  peaceful  阅读(136)  评论(0编辑  收藏  举报