Divide and Conquer:River Hopscotch(POJ 3258)

题目大意:一群牛在河上的石头上跳来跳去,现在问你如何通过去掉M个石头,使得牛跳过石头的最短距离变得最大?
这一题比较经典,分治法的经典,二分法可以很方便处理这个问题,我们只要明白比较函数这个东西就可以了。
模板:
while (……)
{
mid = (lb + rb) / ;
if (Judge_C(……))
else rb = mid;
}
while判断条件可以根据是整形还是浮点型灵活变换,Judge_C就是比较函数,几乎所有的分治算法都可以这样归纳,我们只要找到合适的比较函数就可以了
对于这题来说,他的比较函数可以这样看,我们先把石头去掉M个,然后在这些位置摆上,求最大的那个最短距离。
这样一来,我们只用规定好上限就可以了(上限是length+1)
#include <functional>
#include <iostream>
#include <algorithm> using namespace std; void Search(const int, const int);
bool Judge_C(const int, const int, const int); static int rock[];
static int Min_Step; int main(void)
{
int Length, M, Block_Sum;
while (~scanf("%d%d%d", &Length, &Block_Sum, &M))
{
for (int i = ; i <= Block_Sum; i++)
scanf("%d", &rock[i]);//rock储存的位置 rock[] = ;
rock[Block_Sum + ] = Length;//把开始的位置和结束的位置都存在数组里面 sort(rock, rock + Block_Sum + );
Search(M, Block_Sum);
}
return ;
} bool Judge_C(const int M, const int Block_Sum, const int min_distance)
{
int last = , pos = ; for (int i = ; i < Block_Sum - M; i++)
{
pos = last + ;
while (pos <= Block_Sum && rock[pos] - rock[last] < min_distance)
pos++;
if (pos == Block_Sum + )
return false;
last = pos;
}
return true;
} void Search(const int M, const int Block_Sum)
{
int lb = , rb = rock[Block_Sum + ] + , mid; while (rb - lb > )
{
mid = (lb + rb) / ;
if (Judge_C(M, Block_Sum, mid))
//判断C(x):把去掉M个石头看成去掉在这些位置放Block_Sum-M个石头
//注意上界是L+1,然后用二分逼近
lb = mid;
else rb = mid;
}
printf("%d\n", lb);
}

Divide and Conquer:River Hopscotch(POJ 3258)的更多相关文章
- E - River Hopscotch POJ - 3258(二分)
E - River Hopscotch POJ - 3258 Every year the cows hold an event featuring a peculiar version of hop ...
- River Hopscotch POJ - 3258
Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully ...
- Divide and conquer:Telephone Lines(POJ 3662)
电话线 题目大意:一堆电话线要你接,现在有N个接口,总线已经在1端,要你想办法接到N端去,电话公司发好心免费送你几段不用拉网线,剩下的费用等于剩余最长电话线的长度,要你求出最小的费用. 这一看又是一个 ...
- Divide and Conquer:Monthly Expense(POJ 3273)
Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 #include <iostr ...
- Divide and conquer:K Best(POJ 3111)
挑选最美的珠宝 题目大意:挑选k个珠宝使得∑a/∑b最大,输出组合数 最大化平均值的标准题型,二分法就好了,一定要注意范围(10e-7),如果是10e-8就会tle,10e-6就是wa #inclu ...
- Divide and conquer:Dropping tests(POJ 2976)
最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最大的平均值是w,那么题目 ...
- Divide and conquer:Aggressive Cows(POJ 2456)
侵略性的牛 题目大意:C头牛最大化他们的最短距离 常规题,二分法即可 #include <iostream> #include <algorithm> #include < ...
- Divide and Conquer:Cable Master(POJ 1064)
缆绳大师 题目大意,把若干线段分成K份,求最大能分多长 二分法模型,C(x)就是题干的意思,在while那里做下文章就可以了,因为这个题目没有要求长度是整数,所以我们要不断二分才行,一般50-100次 ...
- 二分搜索 POJ 3258 River Hopscotch
题目传送门 /* 二分:搜索距离,判断时距离小于d的石头拿掉 */ #include <cstdio> #include <algorithm> #include <cs ...
随机推荐
- linuxMint下安装ftp工具--filezilla
windows下ftp工具有好多,linux下推荐用filezilla 安装filezilla很简单,安装完后,使用方式和windows下面一样. 第一种方式: 直接去filezilla官网下载软件包 ...
- WCF--验证码实现...
未开始待续... 未完待续...
- ROS Hotspot服务器的搭建与设定!(上网认证)
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 说明:由于Hotspot设定的步骤比较多,此文档只讲解如何设定Hotspot的方法,关于ROS的安装与路由上网的配置请自行百度查阅. ...
- PHP基础之 数组(二)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- I’ve seen the world,lit it up as my stage now
I've seen the world,lit it up as my stage now 阅尽繁华 点亮红尘做舞台 Channeling angels in,the new age now 粉末登场 ...
- Javascript高级程序设计——基本包装类型
既然js中的基本类型没有属性和方法那么为什么对字符串进行subString()方法可以呢?基本类型不应该没有方法的吗? 这就是基本包装类型啦! ECMAScript提供了三个特殊的引用类型,Boole ...
- MongoDB—— 写操作 Core MongoDB Operations (CRUD)
MongoDB使用BSON文件存储在collection中,本文主要介绍MongoDB中的写操作和优化策略. 主要有三种写操作: Create Update ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- Divide Two Integers
视频讲解 http://v.youku.com/v_show/id_XMTY1MTAyODM3Ng==.html int 范围: Integer.MIN_VALUE => -214748364 ...
- osc的git服务器简单使用。
1.创建本地仓库 mkdir dir cd dir git init 初始化仓库 2.创建远程仓库 进入远程仓库去创建 3.关联本地仓库与远程仓库 git remote add osc git::.. ...