题目: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;
}
来源: http://blog.youkuaiyun.com/acm_ted/article/details/20137869