Input : 输入木棒根数n,要得到的等长木棒数量K,以及n根木棒的长度。
Output : 等长木棒的最大长度。
用二分法求解这道题,首先要找到以得到的等长木棒数量为因变量、等长木棒长度为自变量函数。
int getK(int l){//随着l增大,返回值会减小 int k = 0;for(int i=0;i<n;i++){k += L[i]/l;}return k;
}
其次,最后要找的l是最后一个满足k>=K的长度,不妨转化为第一个满足k<K的l,然后减一。
可以写出二分函数
int BS(int l,int r,int K){int mid;while(l<r){mid = (l+r)/2;if(getK(mid)<K){r = mid;//减小l}else{l = mid+1;//增大l } }return l;
}
完整代码
#include<cstdio>
#include<iostream>
#include<set>using namespace std;const int maxn = 10010;int n,K;//有n根木棒,至少要求得到K根等长的
int L[maxn];int getK(int l){//随着l增大,返回值会减小 int k = 0;for(int i=0;i<n;i++){k += L[i]/l;}return k;
}int BS(int l,int r,int K){int mid;while(l<r){mid = (l+r)/2;if(getK(mid)<K){r = mid;//减小l}else{l = mid+1;//增大l } }return l;
}int main(){cin>>n>>K;for(int i=0;i<n;i++){cin>>L[i];}int l = BS(0,100,K);cout<<"木棒的最大长度为:"<<l-1<<endl;return 0;
}
结果