您的位置:首页 > 其它

ACM: 一题二分搜索题.  poj3258  & 4000 nbsp;…

2016-05-19 23:16 323 查看
                                                             
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 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 ≤ M ≤ N).

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

题意与思路:     与3273类似.

代码:

#include <iostream>

#include <cstdio>

#include <stdlib.h>

using namespace std;

#define MAX 50005

int a[MAX];

int L , N , M;

int cmp(const void *a , const void *b)

{

    return
*(int*)a - *(int*)b;

}

int find(int mid)

{

    int k =
0;

    int i , j =
0;

    for(i = 1; i
<= N+1; ++i)

    {

  
   
 if(a[i] - a[j] <= mid)

  
   
 {

  
   
   
 k++;

  
   
 }

  
   
 else

  
   
 {

  
   
   
 j = i;

  
   
 }

    }

    if(k
> M)

  
   
 return 0;

    else

  
   
 return 1;

}

int result(int &left,int
&right)

{

    int
mid;

    while(left
<= right)

    {

  
   
 mid = (left+right) / 2;

  
   
 if( find(mid) == 1 )

  
   
   
 left = mid + 1;

  
   
 else

  
   
   
 right = mid - 1;

    }

    

    return
left;

}

int main()

{

    while(cin
>> L >>
N >> M)

    {

  
   
 a[0] = 0 , a[N+1] = L;

  
   
 int i;

  
   
 int left = 0 , right = L;

  
   
 for(i = 1; i <= N; ++i)

  
   
 {

  
   
   
 cin >> a[i];

  
   
 }

  
   
 

  
   
 qsort(a,N+2,sizeof(int),cmp);

  
   
 cout <<
result(left,right) << endl;

    }

    

    return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: