C++关键字排序——[F]超级宝贝大奖赛2(猜数字,最接近的获奖)

题目描述

全国性的超级宝贝大奖赛即将拉开帷幕,每个拥有中国国籍的人都可以参加,但最后只取前三位,冠名为具有中国传统历史概念的状元(第一名)、榜眼(第二名)、探花(第三名)。
  每个报名者只要给出任意一个数字即可,因为主办方早就暗藏了一个数字,距离官方数字最近的三个数字的报名者即将获得环太阳系旅游的奖励。
  如果和官方数字的距离相同,则按照报名顺序排列。

输入

第一行一个正整数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;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值