Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 36 Accepted Submission(s): 18
5 WuSong 12 LuZhishen 12 SongJiang 13 LuJunyi 1 HuaRong 15 5 WuSong LuJunyi LuZhishen HuaRong SongJiang 0
HuaRong 15 SongJiang 13 LuZhishen 12 WuSong 12 LuJunyi 1 3 2 5 3 1 2
解题思路:
题意为给N个英雄,每个英雄有自己的名字和杀敌人的个数,现在给这些英雄排名,首先按杀敌人的个数多少排名,杀敌人越多,排名越靠前,如果杀敌人个数相同,那么名字字母序小的排名靠前。给定n个英雄的名字和杀敌人的个数,首先按排名输出英雄的名字以及杀敌人个数,然后有q个询问,每个询问包括一个英雄的名字,然后输出该英雄的主排名和次排名,主排名意思是比该英雄杀敌人个数多的英雄个数+1,次排名意思是和该英雄杀敌人个数相同但排名比他靠前的英雄个数+1,如果次排名是1的话,只输出主排名,否则两者都输出。
给结构体排序,然后用map记录下英雄名字以及杀敌人个数,然后线性在结构体数组里面查找就可以了。
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <cmath>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cctype>
using namespace std;
#define ll long long
const int maxn=202;
struct P
{
string name;
int k;
}p[maxn];
bool cmp(P a,P b)
{
if(a.k>b.k)
return true;
else if(a.k==b.k)
{
if(a.name<b.name)
return true;
return false;
}
return false;
}
int n;
map<string,int>mp;
void find(string str)
{
int major=1;
int minor=1;
for(int i=1;i<=n;i++)
{
if(p[i].name==str)
{
break;
}
if(p[i].k>mp[str])
major++;
if(p[i].k==mp[str])
minor++;
}
cout<<major;
if(minor!=1)
cout<<" "<<minor<<endl;
else
cout<<endl;
}
int main()
{
while(cin>>n&&n)
{
mp.clear();
for(int i=1;i<=n;i++)
cin>>p[i].name>>p[i].k;
sort(p+1,p+1+n,cmp);
for(int i=1;i<=n;i++)
{
cout<<p[i].name<<" "<<p[i].k<<endl;
mp[p[i].name]=p[i].k;
}
int q;
string str;
cin>>q;
while(q--)
{
cin>>str;
find(str);
}
}
return 0;
}
[ACM] HDU 5131 Song Jiang's rank list (模拟)
原文:http://blog.csdn.net/sr_19930829/article/details/41702319