网线主管。。。
我一直奇怪为什么洛谷没有网线主管,原来是有人抄得一模一样。。。
首先看到这数据范围,然后又是求最优解,首先就要考虑下贪心行不行
我嫌浮点数乘除麻烦,就读入时乘上100,中间二分时r的范围也要乘上100,最后输出时除以100
因为c++自带整除(偏向0取整,你可以试试-3/2),所以中间直接用原绳长除以现在枚举到的新绳长就行了,比较一下能得到的新绳子数与k,更新l/r
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
int n,k;
int a[10007];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
double x;//记得用double类型
cin>>x;
a[i]=1.0*x*100;//乘上100
}
int l=0,r=1e9+1,m;//l是能取到的最小数,r是绝对取不到的数
//1e9=10^9,原来r是<=1e7(10^7),但因为乘上了100,所以范围也乘上100
while(l+1<r){//模板
m=(l+r)/2;
int sum=0;//累加能切出的新绳子段数
for(int i=1;i<=n;i++)
sum+=a[i]/m;//c++的自带整除,也可以用floor
if(sum>=k)l=m;//得到的新绳子数较多,长度还可以更大
else r=m;//长度太大导致新绳子数量不够
}
cout<<fixed<<setprecision(2)<<1.0*l/100<<endl;
//记得保留两位小数,且为了是小数得乘上一个浮点数(1.0)
//应该老师都是讲过的(入门的时候)
return 0;
}