二分贪心--06

xiaoxiao2021-02-27  536

题目大概:

给出n根长度不同的木棒,让我们切成长度相同的m根木棒,问切的木棒的最长长度是多少。

思路:

每根木棒的长度和根数成反比。

长度 l =0,,r为木棒总长度除m。mid=(l+r)/2.。

用二分法不断逼近最大的长度即可。

最后取右端点。

代码:

#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; double l,r=0,mid; double sum=0; double a[100600]; int main() {int n,m,j=0; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) {scanf("%lf",&a[i]); sum+=a[i]; } sum=sum/(double)(m); l=0;r=sum; while(r-l>1e-10) {mid=(l+r)/2; j=0; for(int i=0;i<n;i++) {j+=(int)(a[i]/mid); } if(j>=m){l=mid;} else r=mid; } printf("%.2f\n",r=(int)(r*100)/100.0); return 0; }

转载请注明原文地址: https://www.6miu.com/read-1140.html

最新回复(0)