博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
人以群分
阅读量:6598 次
发布时间:2019-06-24

本文共 992 字,大约阅读时间需要 3 分钟。

 

 

思路:二分答案区间,难点在判断上,因为是要求最小值,所以为了得到最优解,我们要先将a数组排序,这样我们从中选择连续的一段一段作为一组这样得到的最小差值才是我们的最优解。我们思路上这样理解:我们从左往右进行分组,设pos=i表示[1~i]的人可以进行分组,开始先判断第一个区间,第一个区间左端点显然为1,枚举所有区间右端点的所有可能点(判断方程为a[m+i]-a[1]<=mid,右端点为m+i),对于每一种可能的点,我们继续往后判断是否可以进行分组,这时不在考虑它之前的状态考虑它后面一个点作为左区间,判断它可能的所有右区间,一直到判断区间时,左端点达到最右边。

如果[1,i]的人可以进行分组,那么在对后面考虑时我们就不在考虑它,在对它后面[i+1,i+m+k]的区间进行考虑i+m+k为最后一个满足a[i+m+k]-a[i+1]<=mid的数,如果一个区间右边的数满足a[i+m+k]-a[i+1]<=mid,证明这个也可以进行分组,状态pos直接转移到i+m+k。

#include
using namespace std;const int maxn=5e5+10;int vis[maxn];int a[maxn];int n,m;bool dfs(int pos,int mid){ if(vis[pos]==0) vis[pos]=1; else return false; if(pos==n) return true; for(int i=0; pos+m+i<=n&&a[pos+m+i]-a[pos+1]<=mid; i++) { if(dfs(pos+m+i,mid)) return true; } return false;}int main(){ cin>>n>>m; for(int i=1; i<=n; i++) cin>>a[i]; sort(a+1,a+1+n); int l,r; l=0; r=1e9; while(l

 

转载于:https://www.cnblogs.com/dongdong25800/p/10758534.html

你可能感兴趣的文章
【软件推荐】用HTML开发跨桌面应用
查看>>
div垂直居中
查看>>
Decentralized Applications
查看>>
哪种语言的密码更容易破解?
查看>>
如何将MFC程序改为UNICODE类型
查看>>
Open***应用案例
查看>>
php代码规范
查看>>
在分片集群中追踪MongoDB的操作日志
查看>>
判断DataTable为空
查看>>
vs中调用WebService
查看>>
Spring Boot 系统要求
查看>>
【CentOS 7笔记35】,几个特殊符号和一些常用命令#171117
查看>>
五款免费的磁盘空间使用情况报告软件
查看>>
JAVA线程7 - 终止线程
查看>>
网卡绑定(服务器&&交换机),缓存服务器Squid架构配置
查看>>
linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具...
查看>>
Linux的lvm逻辑卷管理
查看>>
web网站加速之CDN(Content Delivery Network)技术原理
查看>>
Redis 数据结构-字符串源码分析
查看>>
关于linux load average的深入了解
查看>>