zoukankan      html  css  js  c++  java
  • 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解

    题目描述

    有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的

    绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数)。

    输入输出格式

    输入格式:

    第一行两个整数N和K,接下来N行,描述了每条绳子的长度Li。

    输出格式:

    切割后每条绳子的最大长度。

    输入输出样例

    输入样例#1:
    4 11
    8.02
    7.43
    4.57
    5.39
    输出样例#1:
    2.00

    说明

    对于100%的数据 0<Li<=100000.00 0<n<=10000 0<k<=10000

    解析

      本来以为是一个浮点型二分查找的题目,于是很开心的做,分数一直不一样,直到发现是一道卡精度的题目.处理这种题目一般是先乘一个大数,最后再去除以这个大数,来确保误差很小.另一个就是审题,题目中明确说是直接舍掉小数点后两位的数字,那么就按照题目,而不是四舍五入.

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cmath>
     4 #include <algorithm>
     5 #define D double
     6 #define E 1e-5
     7 #define Max 10005
     8 D l,r,a[Max];
     9 const D eps=E;
    10 int n,k;
    11 bool check(D x)
    12 {
    13     int ans=0;
    14     for(int i = 1 ; i <= n ; ++ i)
    15         ans += (int)a[i] / x;
    16     if(ans >= k) return true;
    17     else return false;
    18 }
    19 int main()
    20 {
    21     scanf("%d%d",&n,&k);
    22     for(int i = 1 ; i <= n ; ++ i) scanf("%lf",&a[i]);
    23     l=0,r=100000.0;
    24     while(r-l > eps) {
    25         D mid=(l+r) / 2;
    26         if(check(mid)) l=mid;
    27         else r=mid;
    28     }
    29     printf("%.2lf",l);
    30     return 0;
    31 }
    47分代码
     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cmath>
     4 #include <algorithm>
     5 #define D double
     6 #define E 1e-4
     7 #define Max 10005
     8 D l,r,a[Max];
     9 const D eps=E;
    10 int n,k;
    11 bool check(D x)
    12 {
    13     int ans=0;
    14     for(int i = 1 ; i <= n ; ++ i)
    15         ans += (int)a[i] / x;
    16     if(ans >= k) return true;
    17     else return false;
    18 }
    19 int main()
    20 {
    21     scanf("%d%d",&n,&k);
    22     for(int i = 1 ; i <= n ; ++ i) scanf("%lf",&a[i]),a[i]*=100;
    23     l=0,r=100000000.0;
    24     while(r-l > eps) {
    25         D mid=(l+r) / 2;
    26         if(check(mid)) l=mid;
    27         else r=mid;
    28     }
    29     printf("%.2lf",l / 100);
    30     return 0;
    31 }
    85分代码
     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cmath>
     4 #include <algorithm>
     5 #define D double
     6 #define E 1e-4
     7 #define Max 10005
     8 D l,r,a[Max];
     9 const D eps=E;
    10 int n,k;
    11 bool check(D x)
    12 {
    13     int ans=0;
    14     for(int i = 1 ; i <= n ; ++ i)
    15         ans += (int)a[i] / x;
    16     if(ans >= k) return true;
    17     else return false;
    18 }
    19 int main()
    20 {
    21     scanf("%d%d",&n,&k);
    22     for(int i = 1 ; i <= n ; ++ i) scanf("%lf",&a[i]),a[i]*=100;
    23     l=0,r=100000000.0;
    24     while(r-l > eps) {
    25         D mid=(l+r) / 2;
    26         if(check(mid)) l=mid;
    27         else r=mid;
    28     }
    29     l /= 100 ;
    30     if(l-0.0049 > 0) l -= 0.0049;
    31     printf("%.2lf",l);
    32     return 0;
    33 }
    100分代码
  • 相关阅读:
    【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    HDU How many prime numbers
    《大学ACM的总结 》(转载)
    POJ 最小公倍数
    HDU 开门人和关门人
    HDU shǎ崽 OrOrOrOrz
    HDU Saving HDU 2111
    HDU 1106 排序
    strtok函数()
    HDU 2187汶川地震
  • 原文地址:https://www.cnblogs.com/ypay/p/11200053.html
Copyright © 2011-2022 走看看