我用的优先对列来做的,(其实也可以直接用数组,sort排序)
删除最大或最小之后,剩下的数的最大减去最小,再比较
其实就是比较最大和第二小的差t1,和第二大与最小的差t2的大小
比如:
1,2,3,4,5,6,7,-1
八个数,先删除-1,剩下的最大减最小为6,记为t1;
再删除7,最大减最小为7,记为t2,比较t1和t2,t1小输出t1
在这里插入代码片
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int main()
{
int n,k;
priority_queue<int>q;//优先队列,自动排序,从大到小
while(scanf("%d",&n)==1){
int max,min,max2,min2;//定义两个最大和两个最小
while(!q.empty())q.pop();//把队列清空,不然wa到怀疑人生
for(int i=0;i<n;i++){
scanf("%d",&k);
q.push(k);
}//输入数据
max2=q.top();//删除最小数之后的最大,就是整个数据的最大
q.pop();//删除最大数
max=q.top();//删除最大数后的最大,就是整个数据的第二大
if(q.size()==1){
min=q.top();
min2=q.top();
}//输入数据只有2个时
else{
while(q.size()>1){
if(q.size()==2){
min2=q.top();//删除最小数后的最小,就是整个数据的第二小
}//一定要先判断再删除(否则数据为n=3。1,4,4时min2不会被赋值,因此被hack,-_-,好惨)
q.pop();
}
min=q.top();//删除最大数后的最小,就是整组数据的最小
}
int t1=max-min;//删除最大数后的,最大和最小之差
int t2=max2-min2;//删除最小数后的,最大和最小之差
if(t1<t2)printf("%d\n",t1);
else printf("%d\n",t2);
}
return 0;
}