删数字
来源:互联网 发布:艺术签名免费设计软件 编辑:程序博客网 时间:2024/06/01 08:07
题意:给你一个N个数组成的序列,要你删除K个数后,M 表示剩下的数字中任意两个数的差值的最大值,m 表示最小差值,求M+m的最小值。
分析:不断删数时,最小差值是单调不下降的,我们每次只会删最大的数或最小的数。所以我们可以对原序列排序,然后枚举左端点L,用单调队列维护排序后L ~ N - K + L - 1 区间内的m。
#include <cstdio>#include <algorithm>using namespace std;const int N = 1e6 + 10;int n,k;int v[N],lmx[N];int main() { scanf("%d%d",&n,&k); for (int i = 1;i <= n;i ++) scanf("%d",&v[i]); sort(v + 1,v + 1 + n); int head = 1,tail = 0; v[0] = 5 * N,v[n + 1] = -v[0]; for (int i = 1;i <= n - k;i ++) { while (abs(v[i] - v[i - 1]) < abs(v[lmx[tail] + 1] - v[lmx[tail]]) && head <= tail) tail --; lmx[++ tail] = i - 1; } int ans = v[n - k] - v[1] + v[lmx[head] + 1] - v[lmx[head]]; int r = n - k; for (int i = 2;i <= k + 1;i ++) { r ++; while (abs(v[r] - v[r - 1]) < abs(v[lmx[tail] + 1] - v[lmx[tail]]) && head <= tail) tail --; lmx[++ tail] = r - 1; while (lmx[head] < i) head ++; ans = min(ans,v[r] - v[i] + v[lmx[head] + 1] - v[lmx[head]]); } printf("%d",ans);}
0 0
- 删数字
- 删数字
- 删数字nyoj448
- 数字
- 数字
- 数字:
- 数字
- 数字
- 数字
- 数字
- 数字
- 数字
- 数字
- 数字
- 数字
- 数字
- 【数字】--数字
- Java贪心算法 删数字问题
- nyoj15括号匹配(二)【区间dp】
- 网络爬虫 HTML的高级解析 <web scraping with python>第二章
- 常用推荐算法对比
- C++ 虚函数(4)实例验证
- codeforces 554C Kyoya and Colored Balls 推公式
- 删数字
- Opentaps(OFBiz)在Eclipse下调试配置
- HDU 1159
- Spring AOP 学习之静态代理
- HDU 2546
- 事件处理
- C++第九节:多态、虚函数、抽象类
- 爬虫抓取 第三章
- poj1141Brackets Sequence【区间dp+路径记录】