ZJNU1804SONG F(multiset)

来源:互联网 发布:淘宝网大衣外套 编辑:程序博客网 时间:2024/05/21 15:48

题意就是给你一串数列 , 你要删除k个数要求删除后的数列的 最大值和最小值的差值 加上 差值最小的两个数的差值 的和最小

思路:

先把序列排序,因为你要删除k个数,你剩下的一串数只能是连续的,所以你只能从最左和最右删除,把中间的差值放进multiset 里 每次删除最左的差值 插入最右的差值就好了

AC代码:

 

/* ***********************************************Author        :yzkAcceptedCreated Time  :2016/4/4 19:11:40TASK  :ggfly.cppLANG          :C++************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#include <stack>using namespace std;const int maxn=1000010;int a[maxn];typedef __int64 ll;int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int n,i,j,k,len,minn,cmp;scanf("%d%d",&n,&k);len=n-k;for(i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);multiset<int> my;multiset<int> :: iterator it;for(i=2;i<=len;i++){my.insert(a[i]-a[i-1]);}/*for(it=my.begin();it!=my.end();it++)cout<<*it<<endl;*///cout<<*my.begin()<<endl;minn=a[len]-a[1]+*my.begin();//  cout<<minn<<endl;for(i=len+1;i<=n;i++){cmp=a[i]-a[i-len+1];my.insert(a[i]-a[i-1]);it=my.lower_bound(a[i-len+1]-a[i-len]);my.erase(it);cmp+=*my.begin();minn=min(minn,cmp);}cout<<minn<<endl;    return 0;}

0 0