【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)
2015-04-05 22:30
519 查看
链接:click here~~
【题意】
一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大。
【解题思路】
又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值。
代码:
【题意】
一条河长度为 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 50100 int 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 = 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(二分搜索之最大化最小值)
- 【贪心专题】POJ 2456 Aggressive cows && NYOJ 586 疯牛(最大化最小值 贪心+二分搜索)
- poj 3258 River Hopscotch (二分搜索---最大化最小值)
- POJ - 3258 River Hopscotch(二分搜索:最大化最小值)
- POJ 3258 River Hopscotch(贪心+二分查找 最大化最小值)
- POJ 3258 River Hopscotch (最大化最小值)二分
- POJ 2456 3258 3273 3104 3045(二分搜索-最大化最小值)
- NYOJ 586 疯牛 & POJ 2456(二分搜索 + 贪心)(最大化最小值)
- POJ 3258 River Hopscotch (二分,最大化最小值)
- [ACM] POJ 3258 River Hopscotch (二分,最大化最小值)
- POJ 3258 River Hopscotch (二分 + 最大化最小值 + 模拟双向链表)
- [ACM] POJ 3258 River Hopscotch (二分,最大化最小值)
- 《挑战程序设计竞赛》3.1.1 二分搜索-最大化最小值 POJ1064 2456 3258 3273 3104 3045
- poj_3258 River Hopscotch(二分求最大化最小值)
- poj 3258 River Hopscotch(二分最大化最小值)
- poj 3258 River Hopscotch(二分+贪心)
- poj 2456 Aggressive cows (二分+贪心) (最大化最小值)
- POJ 2456 Aggressive cows(二分搜索最大化最小值)
- poj 3104 Drying(二分搜索之最大化最小值)
- POJ 3258-River Hopscotch(二分+贪心)