http://acm.hdu.edu.cn/showproblem.php?pid=5131
给定m个梁山好汉的名字,和他们杀人的数目
按杀人顺序降序,如果杀人数相同,名字字典序小的在前面,
输出两个顺序,主顺序和次顺序
主顺序为杀人排名,次顺序为相同杀人数组 中在他前面的人数+1
如果为相同杀人组的第一个,就只输出主顺序。。
尴尬,理解错题意,当不为第一个时,我输出的是他前面不小于 他的分数种类。。(以为一个分只算一个人,),这样正好样例也过。。wa了一天。。
#include <bits/stdc++.h>
using namespace std;
const int maxn=2008;
struct Node
{ string x;
int y;
};
bool cmp(string a,string b){
return a<b;
}
vector<string>G[maxn];
string s1[maxn];
Node s[maxn];
int main()
{ int m;
vector<pair<int,int> >tt;
int maxx=-100;
while(cin>>m){
if(m==0) break;
maxx=-100;
for(int i=0;i<maxn;i++)
G[i].clear();
tt.clear();
for(int i=0;i<m;i++){
cin>>s[i].x>>s[i].y;
maxx=max(maxx,s[i].y);//杀人寻到最大值。
}
//sort(s,s+m,cmp);
for(int i=0;i<m;i++)
G[s[i].y].push_back(s[i].x);//类似桶排序
int k;
int sum=0;
for(int i=0;i<maxn;i++)
{ if(G[i].size()){
sort(G[i].begin(),G[i].end(),cmp);
}
}
for(int i=maxn-1;i>=0;i--){
for(int j=0;j<G[i].size();j++)
cout<<G[i][j]<<" "<<i<<endl;
}//根据分数从大到小,内部按字典序输出。
//cout<<"???????"<<endl;
cin>>k;
for(int x=0;x<k;x++){
cin>>s1[x];}
for(int xx=0;xx<k;xx++){
int bh=0;
sum=0;
bool flag=false;
for(int i=maxn-1;i>0&&!flag;i--){
if(G[i].size()) bh++;
for(int j=0;j<G[i].size()&&!flag;j++){
if(G[i][j]==s1[xx]){
//cout<<s1<<" ";
if(j==0)
{ tt.push_back(make_pair(sum+1,0));
flag=true;}
else
{tt.push_back(make_pair(sum+1,j+1));flag=true;}
}
}
if(G[i].size()!=0)
sum+=G[i].size();
}
}
//cout<<"!!!"<<endl;
for(int i=0;i<tt.size();i++)
{ if(!tt[i].second)
cout<<tt[i].first<<endl;
else
cout<<tt[i].first<<" "<<tt[i].second<<endl;
}
for(int i=0;i<maxn;i++)
G[i].clear();
}
return 0;
}