E - River Hopscotch POJ - 3258

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock
in a river. The excitement takes place on a long, straight river with
a rock at the start and another rock at the end, L units away
from the start (1 ≤ L ≤ 1,000,000,000). Along the river between
the starting and ending rocks, N (0 ≤ N ≤ 50,000) more
rocks appear, each at an integral distance Di from
the start (0 < Di < L).

To play the game, each cow in turn starts at the starting rock and tries to reach the finish at the ending rock, jumping only
from rock to rock. Of course, less agile cows never make it to the
final rock, ending up instead in the river.

Farmer John is proud of his cows and watches this event each year. But as time goes by, he tires of watching the timid cows of the
other farmers limp across the short distances between rocks placed too
closely together. He plans to remove several rocks in order to
increase the shortest distance a cow will have to jump to reach the
end. He knows he cannot remove the starting and ending rocks, but he
calculates that he has enough resources to remove up to M rocks
(0 ≤ MN).

FJ wants to know exactly how much he can increase the shortest distance *before* he starts removing the rocks. Help
Farmer John determine the greatest possible shortest distance a cow
has to jump after removing the optimal set of M rocks.

Input

Line 1: Three space-separated integers: L, N, and M

Lines 2… N+1: Each line contains a single integer indicating how far some rock is away from the starting rock. No two rocks share the same position.

Output

Line 1: A single integer that is the maximum of the shortest distance a cow has to jump after removing M rocks

Sample Input

25 5 2

2

14

11

21

17

Sample Output

4

Hint

Before removing any rocks, the shortest jump was a jump of 2 from 0 (the start) to 2. After removing the rocks at 2 and 14, the shortest required jump is a jump of 4 (from 17 to 21 or from 21 to 25).

思路

  • 题意:在一个 竖直的河道内有 有 n+2个岩石, 然后又给了我们 出第一块岩石s之后的n+1块岩石距离 s岩石的距离,奶牛们可以从 从起始s的岩石,到终点e岩石,奶牛只能岩石沿着相邻的岩石 跳跃,问当我们从 s 岩石到e岩石之间的n块岩石之间选择的 m块移除后, 奶牛从 s 一路跳到 e 岩石所需的最小跳最大可以是多少.

  • 思路:我们直接用 二分答案,去枚举每一个移除距离,然后如果两块岩石之间的距离小于 我们二分枚举的距离的话,我们就直接把当前这块石头移除,需要注意的是,在移除当前这块石头之后我们,我们还要考虑后面的 石头到 被移除的石头之前的石头的距离是不是也小于我们枚举的 距离 (具体这样的实现 请看代码)

大佬代码

#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn=5e4+10;
int a[maxn];
int n,m,L;
int f(int x)
{
int l,r;
l=0,r=1;
int ans=0;
while(r<n+2)
{
if(a[r]-a[l]<x)//若最后的end都不满足 就把l所在去了,代码没写那个因为效果一样
{
r++;
ans++;
}
else
{
l=r;
r++;
}
}
return ans;
}
int solve()
{
int l=0,r=L,ans,mid;
while(l<=r)
{
mid=(l+r)/2;
if(f(mid)<=m)
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
return ans;
}
int main()
{
while(~scanf("%d %d %d",&L,&n,&m))
{
a[0]=0;
a[n+1]=L;
for(int i=1;i<=n;++i)
scanf("%d",a+i);
sort(a,a+n+2);
printf("%d\n",solve());
}
return 0;
}

朴素的暴力代码

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std; const int Len = 5e5; int s, n, m;
vector<int> ar; bool work(int mid, vector<int> br)
{
int cnt = 0;
int last = 0;
for(int i = 0; i < br.size() - 2; )
{
int pos = upper_bound(br.begin() + i, br.end() - 1, mid + br[i] - 1) - br.begin();
cnt += pos - i - 1;
last = pos - 1;
i = pos;
} int si = br.size();
if(si > 2 && last != n && br[n+1] - br[n] < mid)
cnt ++;
//cout << mid << " " << cnt << endl;
return cnt <= m;
} int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//freopen("A.txt","r", stdin);
cin >> s >> n >> m;
ar.push_back(0);
int tem;
for(int i = 1; i <= n; i ++)
cin >> tem, ar.push_back(tem);
sort(ar.begin(), ar.end());
ar.push_back(s); int l = 1e9 + 7, r = s;
for(int i = 1; i <= n+1; i ++)
l = min(l, ar[i] - ar[i - 1]); int mid;
int ans;
while(l <= r)
{
mid = (l + r) >> 1 ; if(work(mid, ar))
l = mid + 1, ans = mid;
else
r = mid - 1;
}
cout << ans << endl; return 0;
}

E - River Hopscotch POJ - 3258(二分)的更多相关文章

  1. River Hopscotch POJ - 3258

    Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully ...

  2. Divide and Conquer:River Hopscotch(POJ 3258)

     去掉石头 题目大意:一群牛在河上的石头上跳来跳去,现在问你如何通过去掉M个石头,使得牛跳过石头的最短距离变得最大? 这一题比较经典,分治法的经典,二分法可以很方便处理这个问题,我们只要明白比较函数这 ...

  3. River Hopscotch-[二分查找、贪心]

    Description Every year the cows hold an event featuring a peculiar version of hopscotch that involve ...

  4. poj 3258 二分

    题意:看了很久才懂,有n个石头,去掉m个后,求跳两个石头或石头和岸边距离最小的最大值,就是至少要跳的距离的最大. 参考博客: 代码: #include<stdio.h> #include& ...

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

    River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21939 Accepted: 9081 Desc ...

  6. [ACM] POJ 3258 River Hopscotch (二分,最大化最小值)

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6697   Accepted: 2893 D ...

  7. POJ 3258:River Hopscotch 二分的好想法

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9326   Accepted: 4016 D ...

  8. 【POJ - 3258】River Hopscotch(二分)

    River Hopscotch 直接中文 Descriptions 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一块岩石跳到另一块岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点 ...

  9. 二分搜索 POJ 3258 River Hopscotch

    题目传送门 /* 二分:搜索距离,判断时距离小于d的石头拿掉 */ #include <cstdio> #include <algorithm> #include <cs ...

随机推荐

  1. WinPcap vs Npcap

    1.两者都一直有人在维护,而并不是nmap官网介绍的已经停止维护了,https://nmap.org/npcap/vs-winpcap.html 2.Wireshark默认使用WinPcap,他无法抓 ...

  2. 025.掌握Service-SVC基础使用

    一 Service简介 1.1 Service概念 Service是Kubernetes的核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到 ...

  3. JavaScript(js)函数声明与函数表达式的区别

    在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的. 函数声明与函数表达式用代码写出来是这 ...

  4. Hadoop fs 基础命令

    操作hdfs的基本命令 在hdfs中,路径需要用绝对路径 1. 查看根目录 hadoop fs -ls / 2. 递归查看所有文件和文件夹 -lsr等同于-ls -R hadoop fs -lsr / ...

  5. Linux系统系统盘扩容

    在Linux学习过程中,可能会遇到根目录存储空间不足的问题,这时候如果只是新增一块硬盘并挂载到某个目录上,还需要将数据转移至新的硬盘中才能缓解存储压力.这种操作未免有些繁琐,那可不可以直接对跟目录进行 ...

  6. 网页中三角型的CSS实现

    我们在使用CSS框架的时候,经常会用到下拉框组件,一般该组件里面有个下三角.很多网上用到三角形,如图所示,这个三角形是如何实现的呢? 1.使用CSS可以实现,先来复习一CSS盒子模型相关知识.给出如下 ...

  7. javaScript 基础知识汇总(九)

    1.Rest 参数 与 Spread 操作符 当我们在代码中遇到“..."时,它不是Rest参数就是Spread操作符 区分方法: 若...出现在函数的参数列表,那它表示的就是Rest参数, ...

  8. iview Checkbox 多选框 v-model 赋值方法 this.innerValueArr = [this.previousValue]

    iview Checkbox 多选框 v-model 赋值方法 this.innerValueArr = [this.previousValue]

  9. oracle中plsql练习-----在控制台输出1到100以内的素数。

    一.思路:首先需要知道素数的概念即质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 中心思想是,外循环所有的自然数,内循环折半查询,增加代码的速度,注意:从1开始,需要大于1,但是pl ...

  10. Python——项目-小游戏2-动画绘制

    实现游戏循环还有事件的监听 在上一讲中 你需要完成这样的这样的效果, 如果你还没有完成,请不要继续往下阅读!!切记切记切记.,重要的事情说三遍 我们来看一下什么是游戏循环 所谓的游戏循环很好的理解 就 ...