hdu 5131(2014 广州—模拟)

题意:给你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
",num2);
    else
        printf("
");
}

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;
}

  

原文地址:https://www.cnblogs.com/Przz/p/5409726.html