题目地址: http://poj.org/problem?id=3258

题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况)。 但是如果有很多边取到最小,具体去除哪一个点就有点麻烦了。如果两个最小距离连着,去除公共点最好。  如果没有连着,四个点分别考虑紧邻的,取最小的。 如果多于两条线段取最小随便去,如果仅有一条取最小仍是去紧邻较小的点。   很麻烦就是了。基于这样的思想,每次去掉一个顶点后,再取出最小边,同样处理(借助优先权队列)  。不知这样的贪心是不是对的...

有一个二分答案的做法,现学的.

一般的二分查找是

 while(left<=right){mid=left+(right-left)/2;if(p[mid]==value)  return  mid;else if(p[mid]<value){left=mid+1;}else right=mid-1;}

这个是基于严格单调序列。

看这个题。 首先理解映射关系,一个m对应了一个去m个点的方案集合,在这个集合中,每个方案都对应着执行以后,最短的线段是多少。  我们关心的是那些能取到最大可能值的方案。

显然,m增大,这个对应的最大值f(m)  是在增大的。(在序列给定后,这个函数f是存在的)

现在反过来,一个k,会有一个或者多个m值使f(m)=k,不确定是否存在反函数,但是对给定的k,最小的m0使f(m0)=k;却是唯一的,这样就找到了反函数h(k)=m;

而且按照题意,“最小的最大” 保证了单调性 f(m+1)>=f(m);

下面来证明反函数性质(实际上很显然,这里啰嗦一下)

设f(h(k))=x;

h(k)使操作h(k) 次达到了k,x是最大可能值=> x>=k;

按定义h(x) 是最小的,则h(x)<=h(k) 单调性=>  x<=k;

x==k;

那么我们只要设计一个函数求出h(k) 就行;

如果扫描到一段比给定的最小值小,那么这里必须至少去一个点的,(见下面代码的min_move)可以证明,这个函数接近是h(k),只需要在真正求的时候增加一点优化就完美了

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;int p[50005];int n;
int min_move(int s)
{int start=0;int ans=0;for(int i=1;i<=n+1;i++){if(p[i]-p[start]<s){ans++;}else start=i;}return ans;
}
int main()
{int l,m;cin>>l>>n>>m;for(int i=0;i<n;i++){scanf("%d",&p[i+1]);}p[0]=0;p[n+1]=l;sort(p,p+n+1);   // 使在数轴上依次排列int left=0,right=l;int mid;int ans;while(left<=right){mid=left+(right-left)/2;if(min_move(mid)<=m){ans=mid;left=mid+1;}else right=mid-1;}cout<<ans<<endl;
}

最后注意不是一遇到min_move(mid) ==m 就break; 我们要找的是最大的长度,继续走下去逼近就行。

转载于:https://www.cnblogs.com/jingqi814/p/3581553.html

poj 3258 River Hopscotch 二分答案相关推荐

  1. poj 3258 River Hopscotch 二分

    1 /** 2 大意:给定n个点,删除其中的m个点,其中两点之间距离最小的最大值 3 思路: 二分最小值的最大值---〉t,若有距离小于t,则可以将前面的节点删除:若节点大于t,则继续往下查看 4 若 ...

  2. POJ 3258 River Hopscotch 二分

    题意:奶牛们喜欢在河里的石头上玩跳房子游戏,每次从一个石头跳到另一个石头上.现在知道起点的石头,终点的石头,以及终点石头到起点石头的距离L.又知道起点-终点之间还有N个石头,每个石头到起点的距离记为r ...

  3. POJ 3258 River Hopscotch 经典二分

    点击打开链接 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6189   Accepted: ...

  4. POJ 3258 River Hopscotch (二分)

    题目地址:POJ 3258 水题.二分距离,判断是否可行.需要注意的是最后一个,因为最后一个是没法移除的,所以还要倒着判断一下. 代码如下: #include <iostream> #in ...

  5. POJ 3258 River Hopscotch(二分查找答案)

    一个不错的二分,注释在代码里 #include <stdio.h> #include <cstring> #include <algorithm> #include ...

  6. POJ 3258 -- River Hopscotch(二分)

    题目链接 Description Every year the cows hold an event featuring a peculiar version of hopscotch that in ...

  7. poj 3258 River Hopscotch 【二分】

    题目真是不好读,大意例如以下(知道题意就非常好解了) 大致题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都有唯一的距 ...

  8. poj 3258:River Hopscotch(二分)

    题目链接 L为N+2块石子中最右边石子位置,0最左,M为可移除块数,求移除后相邻石子可达到的最大距离. #include<iostream> #include<cstdio> ...

  9. POJ - 3258 River Hopscotch(二分水题)

    题目链接:点击查看 题目大意:给出n个石头,其位置排列在一个数轴上,起点为0,终点为ed(题目会给出),我们设两两石头之间的间距的最小值为ans,问在移走m块石头之后,ans的最大值是多少 题目分析: ...

最新文章

  1. Java项目:晚会抽奖系统(java+Jdbc+Servlet+Ajax+mysql)
  2. 使用vagrant基于官方的box制作自己的基础box
  3. Centos6.5升级gcc for qt5.3.1
  4. 比ewsa更快的跑包工具_重庆单肩包订购,编织布袋定做厂家
  5. android 加壳 方案,android加壳思路
  6. 数据库备份DBS 新增Region支持:华北2、华东2和华南1
  7. rpm mysql java 驱动_Linux下安装MySQL(rpm方式)
  8. JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)
  9. matlab生猪的出售时机,数学模型程序代码-Matlab-姜启源-第三章-简单的优化模型.doc...
  10. 从一个线上问题看 Elasticsearch 数据清洗方式
  11. python中tab键表示为_python中的tab键表示什么意思
  12. Ubuntu18.04 下载与安装
  13. win7系统升级IE11,打补丁KB2729094失败解决办法
  14. Ubuntu包依赖损坏的解决unmet dependencies
  15. 猎人打猎(一)-----简单的实现
  16. APP使用monkey进行稳定性测试过程
  17. Cocos2d-x 3.x 图形学渲染系列二十三
  18. cv::omni::StereoCalibrate 源码解析 (一) —— 单目标定
  19. 花2个月时间学习,面华为测开岗要30k,面试官竟说:你不是在....
  20. 刷穿codeforces计划之词汇积累——Day1

热门文章

  1. juc原子类之五:AtomicLongFieldUpdater原子类
  2. 计算机启用网络查找,怎么搜索局域网中的电脑
  3. 金税盘怎么安装在电脑上_金税盘怎么安装,电脑重装后怎样安装金税盘税控开票软件?...
  4. 调试器工作原理--CPU软件断点/硬件断点/单步执行标识
  5. spark基础之RDD和DataFrame的转换方式
  6. ControllerBrokerRequestBatch分析
  7. (19)ISE14.7软件生成bit失败永久解决方法(FPGA不积跬步101)
  8. (28)FPGA计数器设计(软核实现)
  9. Vivado定制DDR3 IP核注意事项
  10. c语言词典课程设计报告,C语言课程设计英语词典排版系统