POJ - 3258 River Hopscotch(二分 最大化最小值)

大致题意:

  坐标 从  [0-L], 上有 N 个点 , 现在需要移去 M 个点.求任意两点(包括0,L)点的距离中最小值的最大值

思路:枚举答案,若移去M个点不能达成目标,则使答案变小.

while(l <= r){
     ll mid = l + (r-l)/2;
     // 是否可能使得所有石头之间的距离不小于 mid
     if(check(mid)){
          l = mid+1;
     }else{
          r = mid-1;
     }
}
printf("%lld\n",l-1);    
 1 bool check(ll mid){
 2     ll cnt = 0;
 3     ll pre = 0;
 4     for(ll i = 1 ; i <= N ; i ++){
 5         if(D[i]-D[pre]>=mid){  
 6             pre = i;
 7         }else{    //两块之间距离大于要求距离的话,移去该石头
 8             cnt++;
 9         }
10         if(cnt > M)    return false;
11     }
12     return true;
13 }
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4
 5 #include<string>
 6 #include<vector>
 7 #include<set>
 8 #include<map>
 9 #include<queue>
10 #include<math.h>
11
12 #include<algorithm>
13 #include<iostream>
14
15 const int INF = 0x7f7f7f7f;
16 using namespace std;
17 typedef long long ll;
18
19 /*
20     1<=L<=100000000
21     N:rocks
22     M:remove rocks
23     Di:
24     L N M:
25 */
26
27 ll D[50005];
28 int L,N,M;
29
30 bool check(ll mid){
31     ll cnt = 0;
32     ll pre = 0;
33     for(ll i = 1 ; i <= N ; i ++){
34         if(D[i]-D[pre]>=mid){
35             pre = i;
36         }else{
37             cnt++;
38         }
39         if(cnt > M)    return false;
40     }
41     return true;
42 }
43
44 int main(){
45     while(scanf("%d%d%d",&L,&N,&M) != EOF){
46         D[0] = 0;
47         for(int i = 1 ; i <= N ; i ++)    scanf("%lld",&D[i]);
48         D[++N] = L;
49         sort(D,D+N);
50         ll l = 0 , r = 1000000000;
51         while(l <= r){
52             ll mid = l + (r-l)/2;
53             // 是否可能使得所有石头之间的距离不小于 mid
54             if(check(mid)){
55                 l = mid+1;
56             }else{
57                 r = mid-1;
58             }
59         }
60         printf("%lld\n",l-1);
61     }
62
63     return 0;
64 }
时间: 2024-11-08 22:28:19

POJ - 3258 River Hopscotch(二分 最大化最小值)的相关文章

【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)

链接:click here~~ [题意] 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大. [解题思路] 又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值. 代码: #include <stdio.h> #include <string.h> #include <

POJ 3258 River Hopscotch 二分答案

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6193   Accepted: 2685 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. T

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

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6697   Accepted: 2893 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. T

POJ 3258 River Hopscotch(二分求最小中的最大)

Description 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 th

POJ - 3258 River Hopscotch 二分

题目大意:给出河的宽度L和N块石头,现在要求移除M块石头,使得石头间的距离的最小值达到最大(起点和终点都有一块石头,但这两块石头不能移除) 解题思路:最小值的最大值,肯定用二分了 如果存在最优的距离,那么移走的石头数量肯定刚好是M块的 枚举的时候判断移除石头的数量,只需要从起点开始枚举,然后计算一下在最小跳跃距离内的石头有几个,有几个就移除几个,最后判断移除了多少个石头 如果移走的数量大于M,就表示所枚举的长度偏大 如果移走的数量小于M,就表示所枚举的长度偏小 有一种比较特殊的情况,就是N =

POJ 3258 River Hopscotch 经典二分

点击打开链接 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6189   Accepted: 2683 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a r

poj 3258 River Hopscotch 【二分】

题目真是不好读,大意如下(知道题意就很好解了) 大致题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都有唯一的距离 问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离. //Memory Time //420K 391MS #include<iostream> #include<algorithm> using

二分搜索 POJ 3258 River Hopscotch

题目传送门 1 /* 2 二分:搜索距离,判断时距离小于d的石头拿掉 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 typedef long long ll; 11 const int MAXN = 5e4 + 10; 12 const int INF = 0x3f3f3f3

POJ 3258 River Hopscotch(二分&#183;最小距离最大)

题意  一条河两岸之间有n个石头  求取走m个石头后  使得两个石头间距离的最小值最大 感觉关键是理解题意  简单的二分  二分最小距离  看要取走多少个(cnt)石头  cnt<=m的话 说明最小距离还可以增大  这样就可以二分出答案了 #include <cstdio> #include <algorithm> using namespace std; const int N = 50005; int p[N], l, n, m; bool ok(int k) { int