Divide and Conquer:River Hopscotch(POJ 3258)

                

                  去掉石头

  题目大意:一群牛在河上的石头上跳来跳去,现在问你如何通过去掉M个石头,使得牛跳过石头的最短距离变得最大?

  这一题比较经典,分治法的经典,二分法可以很方便处理这个问题,我们只要明白比较函数这个东西就可以了。

  模板:

    while (……)
    {
        mid = (lb + rb) / 2;
        if (Judge_C(……))
        else rb = mid;
    }

  while判断条件可以根据是整形还是浮点型灵活变换,Judge_C就是比较函数,几乎所有的分治算法都可以这样归纳,我们只要找到合适的比较函数就可以了

  对于这题来说,他的比较函数可以这样看,我们先把石头去掉M个,然后在这些位置摆上,求最大的那个最短距离。

  这样一来,我们只用规定好上限就可以了(上限是length+1)

  

 1 #include <functional>
 2 #include <iostream>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 void Search(const int, const int);
 8 bool Judge_C(const int, const int, const int);
 9
10 static int rock[50005];
11 static int Min_Step;
12
13 int main(void)
14 {
15     int Length, M, Block_Sum;
16     while (~scanf("%d%d%d", &Length, &Block_Sum, &M))
17     {
18         for (int i = 1; i <= Block_Sum; i++)
19             scanf("%d", &rock[i]);//rock储存的位置
20
21         rock[0] = 0;
22         rock[Block_Sum + 1] = Length;//把开始的位置和结束的位置都存在数组里面
23
24         sort(rock, rock + Block_Sum + 2);
25         Search(M, Block_Sum);
26     }
27     return 0;
28 }
29
30 bool Judge_C(const int M, const int Block_Sum, const int min_distance)
31 {
32     int last = 0, pos = 0;
33
34     for (int i = 0; i < Block_Sum - M; i++)
35     {
36         pos = last + 1;
37         while (pos <= Block_Sum && rock[pos] - rock[last] < min_distance)
38             pos++;
39         if (pos == Block_Sum + 1)
40             return false;
41         last = pos;
42     }
43     return true;
44 }
45
46 void Search(const int M, const int Block_Sum)
47 {
48     int lb = 0, rb = rock[Block_Sum + 1] + 1, mid;
49
50     while (rb - lb > 1)
51     {
52         mid = (lb + rb) / 2;
53         if (Judge_C(M, Block_Sum, mid))
54             //判断C(x):把去掉M个石头看成去掉在这些位置放Block_Sum-M个石头
55             //注意上界是L+1,然后用二分逼近
56             lb = mid;
57         else rb = mid;
58     }
59     printf("%d\n", lb);
60 }

时间: 2024-10-06 09:00:13

Divide and Conquer:River Hopscotch(POJ 3258)的相关文章

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 uni

Divide and conquer:Telephone Lines(POJ 3662)

电话线 题目大意:一堆电话线要你接,现在有N个接口,总线已经在1端,要你想办法接到N端去,电话公司发好心免费送你几段不用拉网线,剩下的费用等于剩余最长电话线的长度,要你求出最小的费用. 这一看又是一个最小化最大值的问题(也可以看成是最大化最小值的问题),常规方法一样的就是把这个费用二分就好,但是这道题是道图论题,不一定经过所有的点,那我们就以二分基准长度为界限,把小于基准长度的那一部分看成是0,大于等于基准长度的看成是1,这样我们只用SPFA算法算最短路径就可以了,非常的巧妙 参考:http:/

Divide and conquer:Monthly Expense(POJ 3273)

Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 1 #include <iostream> 2 #include <functional> 3 #include <algorithm> 4 5 using namespace std; 6 7 static int money_set[100010]; 8 9 void Search(const int,

Divide and conquer:Aggressive Cows(POJ 2456)

侵略性的牛 题目大意:C头牛最大化他们的最短距离 常规题,二分法即可 1 #include <iostream> 2 #include <algorithm> 3 #include <functional> 4 5 using namespace std; 6 7 static int pos[100000]; 8 9 bool judge(const int, const int,const int); 10 void solve(const int, const i

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 二分答案

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

二分搜索 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 【二分】

题目真是不好读,大意如下(知道题意就很好解了) 大致题意: 一条河长度为 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

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11031   Accepted: 4737 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.