**codeforces round 529 div3 b題**
阿新 • • 發佈:2018-12-30
我用的優先對列來做的,(其實也可以直接用陣列,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; }