luogu2678 跳石子 二分
题目大意:
一个赛道上除起点、终点外有\(N\)个点。现要求你从中删除\(M\)个点,使得剩余点序列中相邻的点的最小值最大。求这个最大的最小值。
思路
我们最容易想到的算法便是:对序列从头到尾循环\(M\)次,每次把间距最小的一对点删除其中一个,删除的那一个点到两边的点的距离之和应当是相对小的那一个。但是代码具体实现怎么做?而且时间复杂度也太高了!此时我们应当直接换切入点,而不是想方设法在这个思路上寻找解决方法。
题中要我们求的是值,而值的范围由起点和终点不改变已经是有限了。而且显然要求的这个最小值越大,要删去的点不变或越多,否则不变越少。于是我们就可以对要求的最大的最小值进行UpperBound二分了。
那么对于一个潜在的值mid,如何得知要想使剩余点序列中相邻的点的最小值至少为\(m\)要删去多少个点呢?问题就在于,如果我们知道一对相邻点距离小于mid,我们是删除左面的点还是右面的点。贪心告诉我们删除右面的点,因为删除右边的点r会影响到更右边的点r',它若不删去r则它与相邻的点的距离小于mid,那么它更可能不用删去它本身而满足条件,而删除左面的点达不到这样的效果。
//#define _DEBUG//DELETE!!!!!!!!!!!!!!!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_P = 50010;
int P[MAX_P];
int N, M, L;
bool CanDelInM(int x)
{
int lastPos = 0, cnt = 0;
for(int i=1; i<=N+1; i++)
{
if(P[i] - lastPos < x)
cnt++;
else
lastPos = P[i];
}
return cnt <= M;
}
int UpperBound(int l, int r, bool (*GreaterOrEqual)(int))
{
while(r > l)
{
int mid = (l + r + 1) / 2;
if(GreaterOrEqual(mid))
l = mid;
else
r = mid - 1;
}
return l;
}
int main()
{
scanf("%d%d%d", &L, &N, &M);
for(int i=1; i<=N; i++)
scanf("%d", P + i);
P[N+1]=L;
sort(P+1, P+N+1);
printf("%d\n", UpperBound(1, L, CanDelInM));
return 0;
}
luogu2678 跳石子 二分的更多相关文章
- bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子
1650: [Usaco2006 Dec]River Hopscotch 跳石子 Time Limit: 5 Sec Memory Limit: 64 MB Description Every ye ...
- 【BZOJ】1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分+贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1650 看到数据和最小最大时一眼就是二分... 但是仔细想想好像判断时不能贪心? 然后看题解还真是贪心 ...
- BZOJ 1650 [Usaco2006 Dec]River Hopscotch 跳石子:二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1650 题意: 数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次条都从一个石 ...
- bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子【贪心+二分】
脑子一抽写了个堆,发现不对才想起来最值用二分 然后判断的时候贪心的把不合mid的区间打通,看打通次数是否小于等于m即可 #include<iostream> #include<cst ...
- luogu2678 [NOIp2015]跳石头 (二分答案+贪心)
先二分出一个x,我们要算使最近的跳跃距离>=x的最少移除数量是否<=M就可以了 然后就别dp了...贪心就完事了...我肯定能不移就不移比较好... #include<bits/st ...
- bzoj1650 [Usaco2006 Dec]River Hopscotch 跳石子
Description Every year the cows hold an event featuring a peculiar version of hopscotch that involve ...
- NOIP2015跳石头[二分答案]
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...
- UOJ #148. 【NOIP2015】跳石头 二分
#148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...
- Vijos 1981 跳石头 二分
描述 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩 ...
随机推荐
- jQuery学习笔记之概念(1)
jQuery学习笔记之概念(1) ----------------------学习目录-------------------- 1.概念 2.特点 3.选择器 4.DOM操作 5.事件 6.jQuer ...
- Android开发笔记(11)——DialogFragment & 点击监听
转载请注明:http://www.cnblogs.com/igoslly/p/6931519.html DialogFragment使用 & 点击监听 /* DialogFragment是用于 ...
- 控件中出现的e.xxxx之类的
在遇到窗体应用程序开发的时候,会在控件事件的后台写一些代码,特别是带e.xxx什么的 C#中的Graphics g = e.Graphics是什么意思? 解释是: Graphics 这个类,比较特殊, ...
- ajax 三级联动写法
主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- C#快速获取指定网页源码的几种方式,并通过字符串截取函数 或 正则 取指定内容(IP)
//只获取网页源码开始到标题位目的进行测试 //第一种方式经过测试,稍微快点 string url = "http://www.ip.cn"; HttpWebRequest req ...
- VHDL之concurrent之operators
Using operators Operators can be used to implement any combinational circuit. However, as will becom ...
- 使用Reporting Services时遇到的小问题
同事忙不开了交过来的一个小问题,以前我也没有做过Reporting Services相关的. 大概看了一下,是数据集那边的查询代码接收不到报表参数,而且不是单纯地接收不到,具体情况如下.. 命令类型是 ...
- 【技术累积】【点】【编程】【13】XX式编程
(原)函数式编程 核心概念 函数式一等公民(输入输出啥的都可以是函数): 纯函数,固定输入带来固定输出: 阅读性良好,无并发问题,但效率偏低: 大历史背景 旨在描述问题如何计算: 有两位巨擘对问题的可 ...
- javaee Properties键值对写入和读取方法
package Zjshuchu; import java.util.Properties; import java.util.Set; public class Demo03 { public st ...
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...