POJ 3258 River Hopscotch 二分查找

题意:一条长为l(1~1,000,000,000)的河中,有n(1~50,000)块可垫脚的石头(不包括起始点和终点的),给出它们与起始点的距离rock[i],现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大。

View Code
 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 int cmp(const int &a,const int &b)
 6 {
 7     return a<b;
 8 }
 9 int m,n,l;
10 int rock[50005];
11 int dis[50005];
12 int judge(int mid)
13 {
14     int i;
15     int len;
16     int num;
17     num = len = 0;
18     for(i = 1;i <= n+1;i++)
19     {
20         if(len+dis[i] <= mid)
21         len+=dis[i],num++;
22         else
23         len = 0;
24     }
25 
26     if(num <= m)
27     return 0;
28     return 1;
29 }
30 int main()
31 {
32     int i;
33     while(cin>>l>>n>>m)
34     {
35         rock[0] = 0,rock[n+1] = l;
36         for(i = 1;i <= n;i++)
37         cin>>rock[i];
38         sort(rock+1,rock+n+1,cmp);
39         int low,high;
40         low = l;
41         high = l;
42         for(i = 1;i <= n+1;i++)
43         {
44             dis[i] = rock[i]-rock[i-1];
45             if(low > dis[i])
46             low = dis[i];
47         }
48 
49         int mid = (high+low)/2;
50 
51         while(low <= high)
52         {
53             if(judge(mid))
54             high = mid-1;
55             else
56             low = mid+1;
57             mid = (low+high)/2;
58         }
59         cout<<low<<endl;
60     }
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/0803yijia/archive/2013/03/27/2984934.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值