问题描述:
问题模板:
寻找有序序列第一个满足某条件的元素的位置:
(这个条件是从序列左起到右,从不满足条件到开始满足。)
//二分区间为左闭右闭的[left,right],初值必须能覆盖解的所有可能取值
int solve(int left,int right){
int mid;
while(left < right){
mid = (left + right)/2;
if(条件成立){
right = mid;
}
else{
left = mid + 1;
}
}
return left;
}
代码:
#include<iostream>
using namespace std;
int solve(int a[],int left,int right,int k){
int mid,i,num;
while(left<right){ //只有当left = right才会停下来,这时会得到唯一一个值
mid=(left+right)/2;
num=0;
printf("left=%d,right=%d,mid=%d\n",left,right,mid);
for(i=0; i<3; i++){
num=num+a[i]/mid;
}
printf("num=%d\n",num);
if(num<k){
right=mid;
}else{
left=mid+1;
}
}
return left; //返回left或right都可以,因为两者相等
}
int main(){
int a[3]= {10,15,24};
int n,k,len;
scanf("%d",&k);
len=solve(a,0,a[2],k);
printf("长度为%d",len-1);
}