题意:给你n个人以及他们的杀人数。先按杀人数从大到小排名输出,然后是一些询问
一个人名,①输出杀人数比他大的人数和+1;②如果有人杀人数和他一样而且名字的字典序比他小,输出人数+1,没有则无视。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
#define N 100017
map<string,int> mp;
int n;
struct node
{
string name;
int Rank;
} pnode[205]; bool cmp(node a,node b)
{
if(a.Rank != b.Rank)
return a.Rank > b.Rank;
else
return a.name < b.name;
} void fin(string Name)
{
int cur = mp[Name];
int tt= pnode[cur].Rank;
int num1 = 1;
int num2 = 1;
for(int i = cur - 1; i >= 1; i--)
{
if(pnode[i].Rank >tt)
num1++;
if(pnode[i].Rank == tt)
num2++;
}
printf("%d",num1);
if(num2 != 1)
printf(" %d\n",num2);
else
printf("\n");
} int main()
{
int n;
while(scanf("%d",&n) && n)
{
mp.clear();
for(int i = 1; i <=n ; i++)
{
cin>>pnode[i].name>>pnode[i].Rank;
}
sort(pnode+1,pnode+n+1,cmp);
for(int i=1; i<=n; i++)
{
cout<<pnode[i].name<<" "<<pnode[i].Rank<<endl;
mp[pnode[i].name] = i;
}
string tname;
int k;
scanf("%d",&k);
for(int i = 1; i <= k; i++)
{
cin>>tname;
fin(tname);
}
}
return 0;
}