题目链接:http://poj.org/problem?id=3258
题意:有一条河流,上面原来有n个石头,FJ的cow可以从这些石头上跳过去,现在FJ想训练他的cow的跳跃能力,于是乎想移去其中的m个石头,而且他要求,去掉这m个石头后,石头与石头之间的最小值必须最大。
思路:二分答案,然后验证当前答案下最少需要移去的石头数量
my ugly code:
Source Code
Problem: 3258 | User: bingshen | |
Memory: 324K | Time: 172MS | |
Language: C++ | Result: Accepted |
- Source Code
#include<stdio.h> #include<algorithm> using namespace std; int dis[50005]; int n,m; int slove(int mid) { int res=0,temp=0,i,pre=0; for(i=1;i<=n;i++) { if(dis[i]-dis[pre]<mid) res++; else pre=i; } return res; } int max(int a,int b) { if(a>b) return a; else return b; } int main() { int i,left=0,right=0,mid,l; while(scanf("%d%d%d",&l,&n,&m)!=EOF) { left=99999999; right=0; for(i=1;i<=n;i++) scanf("%d",&dis[i]); dis[n+1]=l; n++; sort(dis+1,dis+n+1); for(i=1;i<=n;i++) { if(dis[i]-dis[i-1]<left) left=dis[i]-dis[i-1]; } right=l; while(left<=right) { mid=(left+right)>>1; int temp=slove(mid); if(temp>m) right=mid-1; else left=mid+1; } printf("%d/n",right); } return 0; }