题目:点击打开链接
题意:给n个水浒传的将领以及他们分别的杀敌数,给这些将领们按照杀敌数排序,杀敌数相等的将领按照名字的字典序排序,然后给出m个查询,查询某个将领的排名,如果这个将领是跟某些将领杀敌相等(即排名并列的)则输出两个排名 一个是并列第几名,一个是姓名的排名。如果这个人是姓名中最小的则不用输出两个,一个排名即可。
思路:sort结构体排序,当杀敌书相等则往上查找相等的个数+1就是姓名排名,查到相等的最上面的位置就是并列排名。没有相等的直接输出位置值。
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct node
{
char s[200];
int data;
}a[500];
int cmp(const node &u,const node &v)
{
if(u.data!=v.data)
return u.data>v.data;
else
return strcmp(u.s,v.s)<0;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)
break;
for(int i=0;i<n;i++)
{
scanf("%s%d",a[i].s,&a[i].data);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
printf("%s %d\n",a[i].s,a[i].data);
int m;
scanf("%d",&m);
char str[200];
for(int i=0;i<m;i++)
{
scanf("%s",str);
for(int i=0;i<n;i++)
{
if(strcmp(a[i].s,str)==0)
{
int minn=1,j;
for(j=i-1;j>=0;j--)
if(a[i].data==a[j].data)
{
minn++;
}
else
{
break;
}
if(minn==1)
{
printf("%d\n",i+1);
}
else
{
printf("%d %d\n",j+2,minn);
}
break;
}
}
}
}
return 0;
}