poj 3258 River Hopscotch (二分)
2013-02-21 11:02
274 查看
题目:http://poj.org/problem?id=3258
题意:
一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L。
河中有n块石头,每块石头到S都有唯一的距离
问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离。
代码:
View Code
题意:
一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L。
河中有n块石头,每块石头到S都有唯一的距离
问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离。
代码:
View Code
#include <iostream> #include<cstdio> #include<algorithm> using namespace std; __int64 a[50010]; int n,m; bool cmp(__int64 a,__int64 b) { return a<b; } int juge(__int64 mid) { int i; __int64 sum=0; int num=0; for(i=1;i<=n-1;i++) { if(sum+(a[i]-a[i-1])<=mid) { sum+=a[i]-a[i-1]; num++; } else { sum=0; } } if(num<=m) return 1; else return 0; } int main() { __int64 l; while(scanf("%I64d%d%d",&l,&n,&m)!=EOF) { int i; a[0]=0; for(i=1;i<=n;i++) { scanf("%I64d",&a[i]); } a[i]=l; n=i+1; sort(a,a+n,cmp); /*for(i=0;i<n;i++) { printf("%I64d ",a[i]); } cout<<endl;*/ __int64 low=l; __int64 high=l; __int64 d; for(i=0;i<n-1;i++) { d=a[i+1]-a[i]; if(d<low) low=d; } //cout<<low<<" "<<high<<endl; __int64 mid; while(low<=high) { mid=(low+high)/2; if(juge(mid)) low=mid+1; else high=mid-1; } cout<<low<<endl; } return 0; }
相关文章推荐
- POJ 3258 River Hopscotch (最大化最小值)二分
- POJ 3258 River Hopscotch(二分搜索巧妙利用)
- POJ 3258 River Hopscotch(二分)
- poj 3258 River Hopscotch(二分搜索)
- POJ 3258 River Hopscotch(二分·最小距离最大)
- 【POJ 3258】 River Hopscotch (二分)
- POJ 3258-River Hopscotch(二分+贪心)
- poj 3258 River Hopscotch(二分搜索)
- poj 3258 二分 River Hopscotch
- poj 3258 River Hopscotch (二分与贪心)
- 【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)
- poj 3258 River Hopscotch(二分)
- POJ 3258- River Hopscotch(二分求最小值最大)
- POJ 3258 River Hopscotch(贪心+二分查找 最大化最小值)
- poj-3258 River Hopscotch (二分)
- POJ 3258 River Hopscotch(二分)
- CSU-ACM2017暑假集训2-二分搜索 poj-3258- River Hopscotch
- POJ 3258 River Hopscotch (二分 + 最大化最小值 + 模拟双向链表)
- POJ 3258 River Hopscotch (二分)
- POJ 3258 River Hopscotch (二分)