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
- ZJNU1804SONG F(multiset)
- multiset
- multiset
- multiset
- multiset
- multiset
- multiset
- multiset
- multiset
- multiset
- multiset
- f
- f
- f
- f
- f
- F#
- f
- 关于基本控件Spinner属性大全详解
- android学习总结(1)
- [练习4]js学习之图片的水平滚动
- 贪心算法总结
- qt截获html请求
- ZJNU1804SONG F(multiset)
- 添加自定义事件以及对osg事件队列的简单理解
- 在Win10上安装试用Docker
- 创建滚动条浏览大图
- c++内存分配方式
- 马克飞象写博客
- void类型及void指针
- 重写toString函数
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器