【问题描述】
给定一组正整数,其中最大值和最小值分别为Max和Min, 其中一个数x到Max和Min的距离差定义为:
abs(abs(x-Max)-(x-Min))
其中abs()为求一个数的绝对值
【输入形式】
包括两行,第一行一个数n,表示第二行有n个正整数
【输出形式】
输出一个数x,该数在所有n个数中的距离差最小;如果有两个数的距离差都是最小,输出较小的哪个
【样例输入1】
5
3 1 7 5 9
【样例输出1】
5
【样例输入2】
3
1 3 2
【样例输出2】
2
题解
思路
- 1.结构体存储数和计算出来的dis
- 2.然后压入vector中,用写好的cmp排序规则排序
- 3.输出vector中的第一个元素就可以了
代码
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
int num;
int dis;
};
bool cmp(node a,node b){
if(a.dis!=b.dis)
return a.dis<b.dis;
else
return a.num<b.num;
}
int get_dis(int num,int max,int min){
return abs(abs(num-max)-(num-min));
}
int main(){
int n,max,min;
cin>>n;
vector<int> num;//存放输入
cin>>max;
min=max;
for(int i=1;i<n;i++){
int temp;
cin>>temp;
if(temp>max) max=temp;
if(temp<min) min=temp;
num.push_back(temp);
}
vector<node> res;//计算dis并使用结构体存储方便排序
for(int i=0;i<n;i++){
node temp;
temp.num=num[i];
temp.dis=get_dis(num[i],max,min);
res.push_back(temp);
}
sort(res.begin(),res.end(),cmp);
cout<<res[0].num<<endl;
return 0;
}