算法笔记P135木棒二分问题

#include<bits/stdc++.h>
using namespace std;
int N,K,k=0,a[105],Right=0x3fff;
int f(int l){
    int sum=0;
    for(int i=0;i<N;i++)
        sum+=a[i]/l;
    return sum;
}
void solve(){
    int Left=0;
    while(Left+1<Right){
        int mid=Left+(Right-Left)/2;
        if(f(mid)<K)
            Right=mid;
        else
            Left=mid;
    }
    printf("%d",Left);
    return ;
}
int main(){
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d",&a[i]);
        if(a[i]<Right)
            Right=a[i];
    }
    scanf("%d",&K);
    solve();
    return 0;
}
/*
3
10 24 15
7
*/

注意二分算法中终止循环的条件是left+1<right

猜你喜欢

转载自blog.csdn.net/ur_ytii/article/details/105029863