2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest I. Photo Processing
2024-09-07 02:12:40
题目链接
题意
将一个升序排好的数列切成若干段,要求每段的长度\(\gt k\),对每一段中最大值与最小值的差取个最大值,问这个最大值最小是多少。
思路
二分答案
怎么check呢?
dp一下。
d[i]
表示[1..d[i]]
一段可以按上述要求进行切割,且d[i]
是i
及其之前最靠近i
的位置(即从头开始到i
位置处最远可以切割到的位置),
则若有d[n]==n
,则意味着一整段都可以进行切割。
怎么转移呢?
若[d[i-k]+1,i]
一段能被切割,则[1,i]
一整段就能被切割,于是有d[i]==i
;
否则d[i]
继承上次跑到的最远位置last
.
Code
#include <bits/stdc++.h>
#define maxn 300010
using namespace std;
int n, k, a[maxn], d[maxn];
bool check(int x) {
int last = 0;
for (int i = k; i <= n; ++i) {
int j = d[i-k];
if (a[i] - a[j+1] <= x) last = i;
d[i] = last;
}
return d[n] == n;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
sort(a+1, a+1+n);
int l = 0, r = a[n] - a[1];
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid+1;
}
printf("%d\n", l);
return 0;
}
最新文章
- HTML纯javaScript代码写图片轮播
- hadoop常用命令
- Server Apache Tomcat v7.0 at localhost failed to start.
- canvas粒子demo
- include ";";与include<;>;
- APUE第4章 文件和目录
- SqlDataAdapter的update方法
- html中的一些标签学习
- poj 2049 Finding Nemo(优先队列+bfs)
- iOS 多线程学习笔记 —— GCD
- Win 8.1 无法安装 .net framework3.5
- less样式表
- Linux下安装Oracle11g服务器(转)
- SpringMVC源代码深度分析DispatcherServlet核心的控制器(初始化)
- 10. IDENTITY属性使用小结
- Oracle 正则
- CentOS 6.8下Apache绑定多个域名的方法
- 【Tip】如何在chrome浏览器中查看网页的Header
- Python unittest第一篇:基础入门+命令行编译
- 初拾Java(问题一:404错误,页面找不到)