题意:给定N个人的姓名和他的杀敌数,然后按照杀敌数从大到小排序,数值相同的,名字字典序小的排在前。
然后先把排序的结果输出。
再来M个询问,每个询问是查询某个人的排名,排名由两部分构成。第一部分是求出杀敌数比他大的人数+1,第二部分是跟他杀敌数相同但排名比他靠前的人数+1,如果第二部分的答案是1,则不用输出。
N和M都不过200,于是水题一枚,对于询问直接暴力扫就行了。= = 虽然写个优美的树状数组把复杂度降成O(M logN)也可以。但比赛那会我还是直接N^2暴力的。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
map<string,int> MP;
struct Name{
char s[60];
int v;
bool operator < (const Name &A)const{
return v>A.v || (v==A.v && strcmp(s, A.s)<=0);
}
}p[300];
char s[60];
int main(){
int n, m;
while(~scanf("%d", &n) && n){
MP.clear();
for(int i=0; i<n; i++){
scanf("%s %d", p[i].s, &p[i].v);
MP[p[i].s] = p[i].v;
}
sort(p, p+n);
for(int i=0; i<n; i++) printf("%s %d\n", p[i].s, p[i].v);
scanf("%d", &m);
int a, b, c;
while(m--){
a = b = 0;
scanf("%s", s);
c = MP[s];
for(int i=0; i<n; i++){
if(strcmp(p[i].s, s)==0) break;
if(p[i].v>c) a++;
else b++;
}
printf("%d", a+1);
if(b) printf(" %d", b+1);
puts("");
}
}
return 0;
}