/* Author: ACb0y Date: 2010-7-10 Result: AC Description: hdu 1084 What Is Your Grade? */ #include <iostream> #include <map> #include <string> #include <algorithm> using namespace std; struct node { int solve; string time; int order; int score; }; node data[110]; int t[6]; int cmp_order(node a, node b) { return a.order < b.order; } int cmp_solve(node a, node b) { if (a.solve != b.solve) { return a.solve > b.solve; } else { return a.time < b.time; } } int main() { int n; #ifndef ONLINE_JUDGE freopen("1084.txt", "r", stdin); #endif while (cin >> n) { if (n < 0) { break; } //用来记录做了n题的人有多少个。 map<int, int> m; int i; for (i = 0; i < n; i++) { cin >> data[i].solve >> data[i].time; //统计做了n题(data[i].solve)的人数。 if (m.find(data[i].solve) != m.end()) { m[data[i].solve] = m[data[i].solve] + 1; } else { m[data[i].solve] = 1; } data[i].order = i; } //只有前一半的人才能多得到5分, //并把能多得5分的人数记录在t数组中。 for (i = 5; i >= 1; i--) { if (m.find(i) != m.end()) { //当只有一个人的时候做完了n题则这个人直接可以多得5分 if (m[i] == 1) { t[i] = 1; } else { t[i] = m[i] / 2; } } else { t[i] = 0; } } //根据做题数排序,做题数相同的,用时短的排在前面 sort(data, data + n, cmp_solve); //给每个学生分数 for (i = 0; i < n; i++) { switch (data[i].solve) { case 0: data[i].score = 50; break; case 1: //前一半的人可以多拿5分。 if (t[1] > 0) { //可多拿5分的人数减一 t[1]--; data[i].score = 65; } else { data[i].score = 60; } break; case 2: if (t[2] > 0) { t[2]--; data[i].score = 75; } else { data[i].score = 70; } break; case 3: if (t[3] > 0) { t[3]--; data[i].score = 85; } else { data[i].score = 80; } break; case 4: if (t[4] > 0) { t[4]--; data[i].score = 95; } else { data[i].score = 90; } break; case 5: data[i].score = 100; break; } } //根据学生序号排名并输出相应的成绩 sort(data, data + n, cmp_order); for (i = 0; i < n; i++) { cout << data[i].score << endl; } cout << endl; } return 0; }