题意:

给你n个人的位置,每个人最多移动k个单位,然后在某点>=3人可以抱团,问你这n个人最少抱团数,只要有一个n不能抱团输出-1;

思路:

感觉又是超级超级狗血。。。。

剪不断,理还乱。。。

现对人的位置拍个序

一开始想的是贪心,纯粹因为n1e5...,然后思路是对于每个位置搞一下,能延伸的最远距离,然后自然而然GG,位置没有办法。

后面去想对于每个人,向两边延伸最长距离,然后状态转移GG= =、

然后想前i个人,后面副参考窝大哥的博客,他是以第i个人为左边界,然后右边界的位置就是pos[i]+2*k,然后在数组里面找一下这个位置的人的位置,两个人区间人数>=3,然后取最小就好了;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f; const int N=1e5+10;
int f[N],a[N];
int n,k; int dfs(int i)
{
if(f[i]!=-1)
return f[i];
if(i==n)
return f[i]=0;
int pos=upper_bound(a,a+n,a[i]+k)-a;
f[i]=INF;
for(int j=pos;j-i>=3;j--)
f[i]=min(f[i],1+dfs(j));
return f[i];
} int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
k*=2;
sort(a,a+n);
memset(f,-1,sizeof(f));
dfs(0);
if(f[0]<=0||f[0]==INF)
f[0]=-1;
printf("Case %d: %d\n",cas++,f[0]);
}
return 0;
}

最新文章

  1. 你真的会玩SQL吗?和平大使 内连接、外连接
  2. ASP.NET 5 (vNext) 理解和概述
  3. 【Android测试】【第十三节】Uiautomator——如何组织好你的测试代码(项目实战)
  4. c#创建、安装、卸载、调试windows服务的简单事例
  5. my sql
  6. Grunt 新手指南
  7. JSP/Servlet 中的汉字编码问题
  8. 用InstallShield 打包工具 打 Win32 程序 (depends.exe 用看程序都依赖了哪些dll)
  9. Web开发——Tomcat的配置
  10. JAVA中集合输出的四种方式
  11. linux常用命令-搜索
  12. PT100测温电路经验
  13. [MSDN] 使用 SharePoint 2013 中的 JavaScript 库代码完成基本操作
  14. Spark保存到HDFS或本地文件相关问题
  15. Java ASM介绍
  16. 在github上最热门好评高的ROS相关功能包
  17. json 按照字段分类
  18. BOM 浏览器对象模型_Storage 接口 - window.sessionStorage - window.localStorage
  19. 如何优化Spring Cloud微服务注册中心架构?
  20. system generator学习笔记【02】

热门文章

  1. UniversalImageLoader 学习
  2. Create an OData v4 Endpoint Using ASP.NET Web API 2.2(使用ASP.NET Web API 2.2创建OData v4端点)
  3. [学些东西]用爬虫练习网站来练习burp suite
  4. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码
  5. java object monitor
  6. Delphi类的默认区域
  7. ckeditor html标签的class 等attribute属性都被屏蔽啦,替换成空的解决方案
  8. appium(3)-Running Tests
  9. 一些js及css样式
  10. 2U网络机箱的尺寸是多少,4U网络机箱的尺寸是多少