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

链接:click here~~

【题意】

一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大。

【解题思路】

又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值。

代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;#define maxn 50100int L, N, M;int dist[maxn];bool C(int d){int last = 0;for (int i = 1; i < N – M; ++i){int cur = last + 1;while (cur<N&&dist[cur]-dist[last]<d) // 搜寻满足条件的最小位置{cur++;}if (cur==N) // 都不满足条件{return false;}last = cur;// 继续搜寻下一个满足条件的最小位置,放置下一个空位}return true;}int main( ){while(scanf("%d%d%d",&L,&N,&M)!=EOF){for(int i=1; i<=N; ++i) cin >>dist[i];N++,dist[N] = L,N++;sort(dist, dist+N);int lb=0, ub=L+1;while(ub-lb>1){int mid=(lb + ub)/2;if (C(mid)){lb = mid;}else ub = mid;}printf("%d\n",lb);}return 0;}

顺境的美德是节制,逆境的美德是坚韧,这后一种是较为伟大的德性。

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

相关文章:

你感兴趣的文章:

标签云: