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