http://acm.hdu.edu.cn/showproblem.php?pid=4004
这道题讲的是青蛙在限定步骤之内跳过河,所以判断最小的每次跳的步长。
思路理解:找到每块石头之间的最大值为石头最小步长,最大值当然就是河宽了。所以剩下了就是用二分枚举了。
//我烦的一个错误就是sort函数是从0-n(sort(a,a+n););
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
//L河的宽度, N个石头,至多m次跳跃 1000000000
//查找一个【所有石头间最短句,河的宽度】
//通过二分查找找到中间值,当不符合的时候,那么比他小的值就跟不符合了!!
//就放在向右的界限里。
bool binarySearch(int a[],int left,int right);
bool panduan(int mid);
int a[500003],k,L,n,m;
int main(){
while(~scanf("%d%d%d",&L,&n,&m)){
a[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);//1-n个数排序
a[n+1]=L;
k=0;
for(int i=1;i<=n+1;i++){
if(k<a[i]-a[i-1]){
k=a[i]-a[i-1];
// printf("%d",k);
}
}
// printf("%d %d %d\n",n,k,L);
binarySearch(a,k,L);
}
}
bool binarySearch(int a[],int left,int right){
int middle;
while (left <right){
middle = (left + right)/2;
// printf("%d..mid.. %d.. %d\n",middle,left,right);
if(panduan(middle)){
right=middle;
// printf(">>");
}else{
left=middle+1;
// printf("<<");
}
// printf("%d..mid.. %d.. %d\n",middle,left,right);
}
printf("%d\n",left);
return false;
}
/*
判断是否从第n+1个数到第n个数决定是否能够成功通过。
*/
bool panduan(int mid){
int now=n+1,i=n+1,step=0;
while(now>0){
while(a[now]-a[i]<=mid&&i>=0){
i--;
}
// printf("%d...i\n",i);
now=i+1;
step++;
}
if(step>m)return false;
// printf("%d..step\n",step);
return true;
}
来源:https://www.cnblogs.com/Yvettey-me/p/4528389.html