**codeforces round 529 div3 b题**

我用的优先对列来做的,(其实也可以直接用数组,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;
	}

猜你喜欢

转载自blog.csdn.net/qq_43552826/article/details/85326408