zoukankan      html  css  js  c++  java
  • POJ-3104 Drying---二分答案判断是否可行

    题目链接:

    https://cn.vjudge.net/problem/POJ-3104

    题目大意:

    有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水。每件衣服每分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发。问最少需要多少时间能烘干所有的衣服。

    解题思路:

    二分答案,然后判断是否可行,如果可行说明当前解>=最优解,区间左移(r = mid - 1)

    反之区间右移

    坑点:k = 1的时候需要特判。

    而且在特判一个解得时候,对每件衣服的水量先减去所花的时间,此时计算烘干机的时间的时候,蒸发量是k - 1而不是k,因为每分钟蒸发一滴水已经算过了

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn = 1e6 + 10;
     8 int n, k;
     9 const ll INF = 1e9 + 7;
    10 ll a[maxn];
    11 bool judge(ll x)
    12 {
    13     ll sum = 0;
    14     for(int i = 1; i <= n; i++)
    15     {
    16         if(a[i] - x > 0LL)
    17         {
    18             sum += (a[i] - x + k - 2) / (k - 1);//使用烘干机的时间
    19         }
    20     }
    21     return sum <= x;
    22 }
    23 int main()
    24 {
    25     cin >> n;
    26     for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
    27     cin >> k;
    28     if(k == 1)
    29     {
    30         cout<<(*max_element(a + 1, a + 1 + n))<<endl;
    31         return 0;
    32     }
    33     ll l = 1, r = INF, ans;
    34     while(l <= r)
    35     {
    36         ll mid = (l + r) / 2;
    37         if(judge(mid))
    38         {
    39             ans = mid;
    40             r = mid - 1;
    41         }
    42         else l = mid + 1;
    43     }
    44     cout<<ans<<endl;
    45     return 0;
    46 }
  • 相关阅读:
    台式机+笔记本的扩展模式+远程登录设置
    Hadoop 集群搭建以及脚本撰写
    Python 入门学习(三)
    1056 Mice and Rice
    1057 Stack
    1058 A+B in Hogwarts
    1059 Prime Factors
    使用熔断器仪表盘监控
    使用熔断器防止服务雪崩
    创建服务消费者(Feign)
  • 原文地址:https://www.cnblogs.com/fzl194/p/9021573.html
Copyright © 2011-2022 走看看