• poj3104 Drying(二分最大化最小值 好题)


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

    一开始思路不对,一直在想怎么贪心,或者套优先队列。。

    其实是用二分法。感觉二分法求最值很常用啊,稍微有点思路的二分就是先推出公式:

    对每件衣服:mid = x1(烘干时间)+x2(晾干时间);a[i] <= k*x1+x2;将1式带入2式得 x1>=(a[i]-mid)/(k-1)即每件衣服最少用时位x1向上取整。

    注意这里k-1为分母,需要单独考虑k=1的情况

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cmath>
     7 #include<map>
     8 #define lson l, m, rt<<1
     9 #define rson m+1, r, rt<<1|1
    10 #define INF 0x3f3f3f3f
    11 typedef long long ll;
    12 using namespace std;
    13 ll n, k, a[100010];
    14 int C(int x)
    15 {
    16     ll tmp=0;
    17     for(int i = 0; i < n; i++){
    18         if(a[i] > x){ 
    19             tmp += int(ceil(1.0*(a[i]-x)/(k-1)));
    20         }
    21     } 
    22     return tmp<=x;
    23 }
    24 int main()
    25 {
    26     ll maxm = -INF;
    27     scanf("%lld", &n);
    28     for(int i = 0; i < n; i++){
    29         scanf("%lld", &a[i]);
    30         maxm = max(maxm, a[i]);
    31     }
    32     scanf("%lld", &k);
    33     if(k==1){
    34         printf("%lld
    ", maxm);
    35         return 0;
    36     }
    37     ll lb=0, ub=maxm;
    38     while(ub-lb>1){
    39         ll mid = (lb+ub)>>1;
    40         if(C(mid)){
    41             ub = mid;
    42         }
    43         else lb = mid;
    44     }
    45     printf("%lld
    ", ub);
    46     return 0;
    47 }
  • 相关阅读:
    工具类网站收藏
    NodeJS 后端 解决 OPTIONS 请求 404 (Not Found)
    Linux scp 指令
    API及工具类页面链接
    JavaScript正则
    Git 常用
    React组件属性类型(propTypes)
    Meta http-equiv属性详解(转)
    js 刷新页面window.location.reload();
    XHTML标签的嵌套规则分析
  • 原文地址:https://www.cnblogs.com/Surprisezang/p/9076064.html
Copyright © 2020-2023  润新知