• poj 1064 Cable master


    题意:给出n条线段,以米的单位给出,小数点后两位(精确到厘米),要你对这些线段裁剪,裁剪出m条等长的线段,并且让这些线段尽可能长另外线段的长度不能小于1厘米,如果筹不够m条,输出0.00

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    const int maxn=10010;
    double num[maxn];
    double eps=1e-5;
    
    
    int main()
    {
            int n, k;
            while(scanf("%d %d", &n, &k)==2) {
                    double maxvalue=0;
                    for(int i=0;i<n;i++) {
                            scanf("%lf", num+i);
                            if(num[i]>maxvalue)
                                    maxvalue=num[i];
                    }
    
                    double lp=0, rp=maxvalue;
                    while(rp-lp>eps) {
                            double mid=(rp+lp)/2;
                            //printf("lp %lf,mid %lf, rp %lf
    ", lp, mid, rp);
                            int sum=0;
                            for(int i=0;i<n;i++)
                            {
                                    sum+=num[i]/mid;
                            }
                            //printf("sum %d
    ", sum);
                            if(sum>=k)
                                    lp=mid;
                            else
                                    rp=mid;
                    }
                    printf("%.2lf
    ", int(rp*100)*0.01);
            }
    
        return 0;
    }

    这题可以用浮点数的二分来写,但是基于题目的意思,完全可以转化为整数

    因为最后长度不能小于1厘米,而一开始给出的线段也是精确到厘米的,而答案也是要求精确到厘米的,那么为什么我们不一开始就把所有的数据都改成用厘米来表示呢?然后直接用整数来二分就可以避免掉所有精度的问题。所以一开始的二分区间就是[1,max{len[i]}] , 不要从0开始,完全没有比较,因为答案最小要为1

    另外,要注意浮点转整形的精度的问题,要四舍五入

    #include <iostream>
    
    #include <cstdio>
    
    #include <cstring>
    
    #include <cmath>
    
    using namespace std;
    
    #define N 10010
    
    int a[N];
    
    int main()
    
    {
    
        int n,m;
    
        double len;
    
        while(scanf("%d%d",&n,&m)!=EOF)
    
        {
    
            int Max = 0;
    
            for(int i=0; i<n; i++)
    
            {
    
                scanf("%lf",&len);
    
                a[i] = len * 100+0.5;//注意精度
    
                    //      printf("len %lf, a[i] %d
    ", len, a[i]);
    
                Max = max(Max , a[i]);
    
            }
    
            int low = 1 , high = Max;
    
            int res = 0;
    
            while(low <= high)
    
            {
    
                int mid = (low + high) >> 1;
    
                            //printf("%d %d %d
    ", low, mid, high);
    
                int count = 0;
    
                for(int i=0; i<n; i++)
    
                    count += a[i] / mid;
    
                if(count >= m)
    
                            {
    
                    res = max(res , mid) ;
    
                                    //res=mid;
    
                                    low = mid + 1;
    
                            }
    
                else
    
                    high = mid - 1;
    
            }
    
            printf("%.2f
    ",(double)res / 100.0);
    
        }
    
        return 0;
    
    }
  • 相关阅读:
    教你一招用 IDE 编程提升效率的骚操作!
    动态拼接sql语句工具类
    mysql数据建模规范
    分割字符串为数字列表
    linux 配置mysql odbc
    nodejs npm常用命令
    (四)jquery easyui panel window使用
    (三)jquery easyui常用form控件的使用
    (二)jquery easyUI提示框的使用
    (一)jQuery easyUI 环境的搭建
  • 原文地址:https://www.cnblogs.com/cute/p/3607913.html
Copyright © 2020-2023  润新知