解题思路

一开始的想法是读入之后直接sortsort排序,那么a[0]a[1]a[n2]a[n1]a[0]、a[1]、a[n-2]、a[n-1]就自然是最小次小次大最大,只过了50%的数据,错在是没考虑到数字重复的问题,最后是设置了四个变量,分成最大组和最小组,最大组一开始都赋值成a[n1]a[n-1],从数组末尾到起始遍历,若能遇到不等于最大的值,那么第一次遇到的就是次大,赋值后跳出,找次小的思路是一样的。
后来想到了去重函数,但是使用去重函数就要讨论读入的数列去重后的数字个数,代码结构上也不算简便就没有使用。

通过代码

#include<bits/stdc++.h>
using namespace std;
int a[110] = {};
int main(){
    int n;
    cin>>n;
    for(int i = 0; i < n; i++)
        cin>>a[i];
    sort(a,a+n);
    int amax1,amin1,amax2,amin2;
    amax1 = a[n-1];
    amax2 = a[n-1];
    amin1 = a[0];
    amin2 = a[0];
    for(int i = n-2; i >= 0; i--){
        if(a[i] != amax2){
            amax2 = a[i];
            break;
        }
    }
    for(int i = 1; i <= n - 1; i++){
        if(a[i] != amin2){
            amin2 = a[i];
            break;
        }
    }
    cout<<amax1 - amax2<<" "<<amax1 - amin2<<" ";
    cout<<amax2 - amin2<<" "<<amax2 - amin1<<endl;
    return 0;
}