zoukankan      html  css  js  c++  java
  • poj 1064

    http://poj.org/problem?id=1064

    题意:就是有N条线段,要分成m段,求每段最大是多少

    这个题挺有意思的。二分答案(答案的区间在0.01和max(len(n))之间)。

    还有一个挺有意思的,就是我发现有个案例我过不了

    4 2540        

    8.02        

    7.43 

    4.57     

    5.39 

    这个我过不了,然后我debug的时候发现,我存的数据和这个不一样,我用Int存的,是每个扩大100倍,但是我的第一个数据变成了801

    我在debug看的时候我发现了一个问题,输入8.02的值,在debug那个窗口显示的确实8.019999999,我感到很奇怪,然后查了一下,也明白了

    因为数据在计算机中的存储都是以二进制来存的,但是0.2在计算机中表示不出来,那么计算机就用一个最接近它的值来表示这个数字

    所以在进行扩大的时候,可以采取四舍五入的方式,这样就可以保证你在扩大的时候不会出现我这种问题,当然这个题的数据问题,不进行四舍五入也是可以过的

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 
     5 int n,m;
     6 int num[10005];
     7 double x;
     8 
     9 int cnt(int x)
    10 {
    11     int tmp = 0;
    12     for(int i = 1;i<=n;i++)
    13         tmp+=num[i]/x;
    14     return tmp;
    15 }
    16 
    17 
    18 int main()
    19 {
    20     while(~scanf("%d%d",&n,&m))
    21     {
    22         int left = 1,Max = 0,ans = 0;
    23         for(int i = 1;i<=n;i++)
    24         {
    25             scanf("%lf",&x);
    26             num[i] = x*100;   //这里也可以改成(x+0.05)*100,这样更加的准确
    27             if(num[i]>Max)
    28                 Max = num[i];
    29         }
    30         while(left<=Max)
    31         {
    32             int mid = (left+Max)/2;
    33             if(cnt(mid)>=m)
    34             {
    35                 left = mid+1;
    36                 ans = mid;
    37             }else
    38             {
    39                 Max = mid-1;
    40             }
    41         }
    42         printf("%.2lf
    ",ans*0.01);
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    成员变量、类变量、局部变量的区别
    微服务学习笔记二:Eureka服务注册发现
    微服务学习笔记一:Spring Cloud简介
    Java集合篇六:Map中key值不可重复的测试
    重写Euqals & HashCode
    Java集合篇五:HashMap
    Java集合篇四:Map的基本应用
    Java集合篇三:Vector
    Java集合篇二:LinkList
    Java集合篇一:ArrayList
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/6700794.html
Copyright © 2011-2022 走看看