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; }