二分到底怎么搞才能永远不出错?我打的二分有两个,在下面,并且标注了问题所在。二分这玩意已经困惑我好久了,看了好多视频但照着打就是错,真的烦心。

代码1(在有些测试点输出会少0.01||40分):
#include<bits/stdc++.h>
using namespace std;
int n,k;
double a[10010];
int g(double x){
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=(int)(a[i]/x);
}
if(cnt>=k)
return 1;
return 0;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
double l=0,r=100000,mid;
while(l<r){
mid=(l+r)/2;
if(g(mid)){
l=mid+0.01;
}else{
r=mid-0.01;
}
}
printf("%.2lf",l-0.01);
return 0;
}
代码2(在有些测试点输出会少0.01,且有些会死循环||50分):
#include<bits/stdc++.h>
using namespace std;
int n,k;
double a[10010];
int g(double x){
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=(int)(a[i]/x);
}
if(cnt>=k)
return 1;
return 0;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
double l=0,r=100000,mid;
while(l<r){
mid=(l+r)/2;
if(g(mid)){
l=mid;
}else{
r=mid-0.01;
}
}
printf("%.2lf",l);
return 0;
}
代码3(问题与代码1相同||40分):
#include<bits/stdc++.h>
using namespace std;
int n,k;
double a[10010];
int g(double x){
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=(int)(a[i]/x);
}
if(cnt>=k)
return 1;
return 0;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
double l=0,r=100000,mid;
while(l<=r){
mid=(l+r)/2;
if(g(mid)){
l=mid+0.01;
}else{
r=mid-0.01;
}
}
printf("%.2lf",l-0.01);
return 0;
}
不是因为二分神金,是我又菜又爱玩