题目:http://pat.zju.edu.cn/contests/pat-a-practise/1025
题解:
先分别排序,再整体排序。要注意相同分数相同名次。
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<string> #include<vector> #include<queue> #include<stack> #include<map> #include<algorithm> using namespace std; struct student { char id[15]; int score; int rankAll; int rankLocal; int localNum; }stu[30005]; bool cmp(const struct student &a,const struct student &b) { if(a.score>b.score) return true; else if(a.score==b.score) return strcmp(a.id,b.id)<0; else return false; } void doRankLocal(int st,int en,int len) { int idx=1,num=1; stu[st].rankLocal=idx; for(int i=1;i<len;++i) { if(stu[st+i].score==stu[st+i-1].score) { stu[st+i].rankLocal=idx; ++num; } else { idx+=num; num=1; stu[st+i].rankLocal=idx; } } } void doRankAll(int st,int en,int len) { int idx=1,num=1; stu[st].rankAll=idx; for(int i=1;i<len;++i) { if(stu[st+i].score==stu[st+i-1].score) { stu[st+i].rankAll=idx; ++num; } else { idx+=num; num=1; stu[st+i].rankAll=idx; } } } int main() { int idx=0; int n,k; scanf("%d",&n); for(int i=0;i<n;++i) { scanf("%d",&k); for(int j=0;j<k;++j) { scanf("%s%d",stu[idx].id,&stu[idx].score); stu[idx].localNum=i+1; ++idx; } sort(stu+idx-k,stu+idx,cmp); doRankLocal(idx-k,idx,k); } sort(stu,stu+idx,cmp); doRankAll(0,idx,idx); printf("%d\n",idx); for(int i=0;i<idx;++i) { printf("%s %d %d %d\n",stu[i].id,stu[i].rankAll,stu[i].localNum,stu[i].rankLocal); } return 0; }