题目描述

给定一个随机的整数(可能存在正整数和负整数)数组nums,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值, 并返回这两个数(按从小到大返回)以及绝对值。 每种输入只会对应一个答案。但是数组中同一个元素不能使用两遍。

输入描述

一个通过空格分割的有序整数序列字符串,最多1000个整数,且整数数值范围是[-65535,65535]。

输出描述

两数之和绝对值最小值 输入 -1 -3 7 5 11 15

输出

-3 5 2

说明

因为|nums[0]+nums[2]|=|-3+5|=2∣nums[0]+nums[2]∣=∣−3+5∣=2 最小,所以返回-3 5 2

using namespace std;
typedef long long ll;
void init()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}
signed main()
{
    init();
    int x;
    int nums[1000] = {-1,-3,7,5,11,15};
    int res=INT_MAX;
    int cur;
    int minvalue,maxvalue;
    bool flag = 0;
    vector<int> vec;
//    while(cin>>x)
//        vec.push_back(x);
    while(scanf("%d",&x)!=EOF)
    {
       vec.push_back(x);
    }
    int n;
 //  cin>>n;
 //   while (n--)
 //   {
 //       cin>>x;
 //       vec.push_back(x);
 //   }

    sort(vec.begin(),vec.end());
    for(int i=0;i<vec.size()-1;i++)
        for(int j=i+1;j<vec.size();j++)
        {
            cur = abs(vec[i]+vec[j]);
            if(cur < res)
            {
                res = cur;
                //minvalue = nums[i];排序后可以直接使用nums[i]和nums[j]
                //maxvalue = nums[j];
                //minindex = i+1;返回索引时可用
                //maxindex = j+1;
                minvalue = ((vec[i]<vec[j])?vec[i]:vec[j]);//不用排序时可用
                maxvalue = ((vec[i]>vec[j])?vec[i]:vec[j]);
            }

        }
    cout<<minvalue<<" "<<maxvalue<<" "<<res<<endl;
    return 0;
}