木材厂有n根原木,现在想把这些木头切割成 k 段长度均为 l 的小段木头(木头有可能有剩余)。
当然,我们希望得到的小段木头越长越好,请求出的最大值。
木头长度的单位是cm,原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。
例如有两根原木长度分别为11和21,要求切割成等长的6段,很明显能切割出来的小段木头长度最长为5。
第一行是两个正整数n,k分别表示原木的数量,需要得到的小段的数量。
接下来行,每行一个正整数L ,表示一根原木的长度。
仅一行,l 即的最大值。
如果连 1cm 长的小段都切不出来,输出0。
- 3 7
- 232
- 124
- 456
114
- #include
- using namespace std;
- int n,k,ans;
- int a[100010],r,l;
- bool check(int x){
- long long sum=0;
- for(int i=1;i<=n;i++){
- sum+=a[i]/x;
- if(sum>=k) return true;
- }
- if(sum>=k)
- return true;
- else
- return false;
- }
- int main() {
- cin>>n>>k;
- r=-1;
- for(int i=1;i<=n;i++){
- cin>>a[i];
- r=max(r,a[i]);
- }
- l=1;
- while(l<=r){
- int mid=(l+r)/2;//mid=(l+r)>>1;
- if(check(mid)==true){
- ans=mid;
- l=mid+1;
- }
- else
- r=mid-1;
- }
- cout<
- return 0;
- }