Cable master POJ - 1064(浮点数二分答案 wa了好久,qwq,好多细节都没注意到)

Cable master POJ - 1064

题意:

就是减绳子,不过数据是输入浮点类型的绳子。
本题输入单位是m。假如找不到答案,最小的分割单位是cm,所以要对答案进行处理即可。具体看代码(假如扩大成int,就不用处理了)

反思:

一直wa。这里做一下浮点数二分的总结。

  1. 假如数据量小的话,可以先变成整数再二分
  2. 对于题目假如说保留 n位小数,那么eps一般设置为 1 e ( − n − 2 ) 1e(-n-2) 1e(n2)
  3. 更特别地,其实可以直接计算100(可能不是100次,具体多少次,根据题目而定)次得出答案。

AC1(double)

# include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 1E5+10;
const double eps = 1e-4;
int n, m;
double a[N];
bool check(double x){
    
    
    int sum  =0;
    for(int i = 1; i <= n; i ++ )sum += (int)(a[i]/x);
    return sum>=m;
}
int main(){
    
    
    cin>>n>>m;
    double l = 0.001, r = 0;
    for(int i =1 ; i <= n; i ++ ){
    
    
        scanf("%lf",a+i);//cin>>a[i];
        r= max(r, (double)a[i]);
    }
    double ans=0;
    while(r-l>eps){
    
    
        double mid = (l+r)/2;
        if(check(mid))ans = mid, l = mid;
        else r = mid;
    }
    printf("%.2f",(int)(r*100)/100.0);//注意这里对答案的处理
    //printf("%.2f", ans);
    return 0;
}

AC2(int)

# include <iostream>
#include <cstdio>

using namespace std;
const int N = 1E5+10;
const double eps = 1e-5;
int n, m;
int a[N];
bool check(int x){
    
    
    int sum  =0;
    for(int i = 1; i <= n; i ++ )sum += (a[i]/x);
    return sum>=m;
}
int main(){
    
    
    while(cin>>n>>m){
    
    
    int l=1, r=0;
    for(int i =1 ; i <= n; i ++ ){
    
    
        double x; //cin>>x;
        scanf("%lf",&x);
        a[i]=x*100.0;
        r= max(r, a[i]);
    }
    int ans=0;
    while(l<=r){
    
    
        int mid = (l+r)/2;
        if(check(mid))ans = mid, l = mid+1;
        else r = mid-1;
    }
    printf("%.2f\n",0.01*ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45377553/article/details/112617665