这道题跟木材加工很像,只不过这次是实数,输出保留小数(不四舍五入)后两位比较难
也可以先乘后除
改天spring和sscanf
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int n,k;
double a[maxn],num;
char s[100];
bool check(double x){
int sum=0;
for(int i=1;i<=n;i++)
sum+=int(a[i]/x);
return sum>=k;
}
double binary(double l,double r){
double mid;
while(r-l>1e-4){
mid=(r+l)/2;
if(check(mid))l=mid;
else r=mid;
}
return l;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lf",&a[i]);
num=max(a[i],num);
}
sprintf(s+1,"%.3f",binary(0,num));
s[strlen(s+1)]='\0';
printf("%s",s+1);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int n,k,a[maxn],num;
double x;
char s[100];
bool check(int x){
int sum=0;
for(int i=1;i<=n;i++)
sum+=a[i]/x;
return sum>=k;
}
int binary(int l,int r){
int mid,ans=0;
while(l<=r){
mid=l+(r-l)/2;
if(mid==0)break;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lf",&x);
a[i]=int(x*100);
num=max(num,a[i]);
}
sprintf(s+1,"%.3f",double(binary(0,num)/100.0));
s[strlen(s+1)]='\0';
printf("%s",s+1);
return 0;
}