[PAT解题报告] PAT Ranking
就是排序问题,每个人有一个id
(13位数字),地区和分数。地区相同的是连续读入的。我们可以把地区相同的按照分数排序,然后算出在地区里的排名local_rank,
注意分数相同的人名次也要相同。这样所有地区都读完之后,每个地区里的人都local_rank都算好了,再总体排序。排序后,和地区算名词类似,分数相同的人名次也要相同——这时是靠id大小决定谁先输出了,所以关键是写cmp函数。
地区排名: 直接按分排,相同分数可以不做区分,因为最后还要再排一次
全局排名: 按分排,分相同的话,id小的在前面。
所有名次都是排序后算出来的。
代码:
#include <algorithm> #include <cstring> #include <cstdio> using namespace std; struct node { char id[15]; int score; int location; int local_rank; int final_rank; }; node a[30010]; bool cmp1(const node &a,const node &b) { return a.score > b.score; } bool cmp2(const node &a,const node &b) { return cmp1(a, b) || ((a.score == b.score) && (strcmp(a.id, b.id) < 0)); } int main() { int m, n = 0; scanf("%d",&m); for (int i = 1; i <= m; ++i) { int p; scanf("%d",&p); for (int j = 0; j < p; ++j) { scanf("%s%d",a[n + j].id, &a[n + j].score); a[n + j].location = i; } sort(a + n, a + n + p, cmp1); for (int j = 0, r = 1; j < p; ++j) { a[n + j].local_rank = (j && (a[n + j].score == a[n + j - 1].score))?r:(r = j + 1); } n += p; } sort(a, a + n, cmp2); printf("%d\n",n); for (int i = 0, r = 1; i < n; ++i) { printf("%s %d %d %d\n",a[i].id, (i && (a[i].score == a[i - 1].score))?r:(r = i + 1), a[i].location, a[i].local_rank); } return 0; }
原题链接:http://www.patest.cn/contests/pat-a-practise/1025