HDU 5131 Song Jiang's rank list(水题)

题目:Song Jiang's rank list

题意:给定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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值