【NOIP2015TGD2T1】poj3258 River Hopscotch

来源:互联网 发布:广州电商美工培训 编辑:程序博客网 时间:2024/06/06 17:03

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

二分答案,求解转判定。
对于每一个答案,从左往右贪心即可。如果当前长度不够,那就需要移走石头。如果够了,重开一段。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int l,n,m,dis[50010],a[50010];bool ok(int x){    int i,j,k,cnt=0,now=0;    for (i=1;i<=n;i++)    {        now+=dis[i];        if (now>=x)          now=0;        else          cnt++;    }    return cnt<=m;}int main(){    int i,j,k,x,y,z,lf,rt,mid;    scanf("%d%d%d",&l,&n,&m);    for (i=1;i<=n;i++)      scanf("%d",&a[i]);    sort(a+1,a+n+1);    for (i=1;i<=n;i++)      dis[i]=a[i]-a[i-1];    dis[n+1]=l-a[n];    n++;    lf=0;    rt=l;    while (lf<rt)    {        mid=(lf+rt+1)/2;        if (ok(mid)) lf=mid;        else rt=mid-1;    }    printf("%d\n",lf);}
0 0
原创粉丝点击