题目描述
全国性的超级宝贝大奖赛即将拉开帷幕,每个拥有中国国籍的人都可以参加,但最后只取前三位,冠名为具有中国传统历史概念的状元(第一名)、榜眼(第二名)、探花(第三名)。
每个报名者只要给出任意一个数字即可,因为主办方早就暗藏了一个数字,距离官方数字最近的三个数字的报名者即将获得环太阳系旅游的奖励。
如果和官方数字的距离相同,则按照报名顺序排列。
输入
第一行一个正整数G,表示官方数字,大小在长整型范围内;
第二行一个正整数N,满足3≤N≤100000;
第三行N个正整数A[i],表示N个报名者给出的数字,大小在长整型范围内;
输出
输出一行,包括三个整数,数字之间用一个空格隔开,表示第一至第三获奖者的报名顺序。
样例
输入
50
5
48 46 50 51 52
输出
3 4 1
参考代码:
刚开始本想用数组完成,后面转念一想结构好像更简单。
#include <bits/stdc++.h>
using namespace std;
struct P{
int num;
int no; //no代表参与的第几个选手编号
int x; //x代表和主办方数字的差值
};
bool cmp(P a,P b){
if(a.x == b.x){
return (a.no < b.no);
}else
return (a.x < b.x);
}
int main()
{
int number,n;
cin>>number>>n;
P a[n];
for(int i=0;i<n;i++){
cin>>a[i].num;
a[i].no = i+1;
}
for(int i=0;i<n;i++)
a[i].x=abs(number-a[i].num);
sort(a,a+n,cmp);
for(int i=0;i<3;i++)
cout<<a[i].no<<" ";
return 0;
}