1. 程式人生 > >**codeforces round 529 div3 b題**

**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;
	}