PTA——7-5 我们爱运动 (15分)
链接:https://pintia.cn/problem-sets/1330440096972591104/problems/1330440124365590532
小明与小红非常喜欢运动,有一次小明与小红去参加校50米短跑的比赛,一共有n(2<=n<=30000)名同学比赛选手,小明是a号选手(1<=a<=n),小红是b号选手(1<=b<=n),由于他们跑的太专注了,最后冲线的时候不知道自己是第几名,只知道每个人最后的成绩,聪明的你可不可以帮帮他们?
输入格式:
第一行 n ,a,b,代表参赛人数n,小明号数a与小红号数b;
第二行 n 个数,x1,x2,…,xn对应着各位选手的成绩。
输出格式:
输出小明与小红的名次,用1个空格分开。
输入样例1:
10 1 10
1 4 5 6 1 2 3 7 8 9
输出样例1:
1 10
输入样例2:
4 1 3
1 2 3.0 2
输出样例2:
1 4
思路:唯一的坑点就是有“并列”的情况,像排名之类的题一定要注意并列的情况。
正确代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
int id;
double p;
};
bool cmp(node a,node b){
if(a.p!=b.p){
return a.p<b.p;
}
return a.id<b.id;
}
int main(){
int n,a,b;
while(scanf("%d %d %d",&n,&a,&b)!=EOF){
node s[n+5];
for(int i=1;i<=n;i++){
double k;
scanf("%f",&k);
s[i].p=k;
s[i].id=i;
}
sort(s+1,s+n+1,cmp);
int k1=1,k2=1;
int m=1;
for(int i=1;i<=n;i++){
if(i){
if(s[i].p!=s[i-1].p){//坑点:有并列的情况
m=i;
}
}
if(s[i].id==a){
k1=m;
}
else if(s[i].id==b){
k2=m;
}
}
printf("%d %d\n",k1,k2);
}
return 0;
}