zoukankan      html  css  js  c++  java
  • Divide and Conquer:Cable Master(POJ 1064)

                    

                     缆绳大师

      题目大意,把若干线段分成K份,求最大能分多长

      二分法模型,C(x)就是题干的意思,在while那里做下文章就可以了,因为这个题目没有要求长度是整数,所以我们要不断二分才行,一般50-100次就可以了,精度足够了

      最后要注意,这一题有四舍五入的陷阱,最好用floor处理一下

      

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <functional>
     4 #include <math.h>
     5 #define MAX 1000000
     6 
     7 using namespace std;
     8 
     9 static double s_set[10010];
    10 
    11 bool C(const double, const int, const int);
    12 
    13 int main(void)
    14 {
    15     int string_sum, cnt;
    16     double lb, rb, mid;
    17 
    18     while (~scanf("%d%d", &string_sum, &cnt))
    19     {
    20         for (int i = 0; i < string_sum; i++)
    21             scanf("%lf", &s_set[i]);
    22         lb = 0; rb = MAX;
    23 
    24         for (int i = 0; i < 50; i++)//50的精度已经足够了
    25         {
    26             mid = (lb + rb) / 2;
    27             if (C(mid, string_sum, cnt))
    28                 lb = mid;
    29             else
    30                 rb = mid;
    31         }
    32         printf("%.2f
    ", floor(mid * 100) / 100);//防止四舍五入
    33     }
    34 
    35     return 0;
    36 }
    37 
    38 bool C(const double cut, const int string_sum, const int K)
    39 {
    40     int tmp_sum = 0;
    41     for (int i = 0; i < string_sum; i++)
    42         tmp_sum += (int)(s_set[i] / cut);
    43 
    44     return tmp_sum >= K;
    45 }

  • 相关阅读:
    MySQL Backup mysqldump 常用选项与主要用法--转发
    openssl 之RSA加密
    Windows 之Dll/lib导出
    缓存雪崩、击穿、穿透
    时间复杂度
    分布式事务
    mysql主从复制与读写分离
    什么是消息队列?
    微服务架构演化
    高并发问题常规思路
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/5065417.html
Copyright © 2011-2022 走看看