zoukankan      html  css  js  c++  java
  • POJ 3104 Drying (二分+精度)

    题目链接:click here~~

    【题目大意】:

     题意:有一些衣服,每件衣服有一定水量,有一个烘干机,每次能够烘一件衣服,每分钟能够烘掉k单位水。

    每件衣服没分钟能够自己主动蒸发掉一单位水,
    用烘干机烘衣服时不蒸发。问最少须要多少时间能烘干全部的衣服。

    【解题思路】:
    题目数据较大。常规方法肯定会TE。首先能够想到二分枚举答案。枚举时间mid值,(一般二分的题目,题目叫你求什么,就二分什么就能够了)
    那么相应两种方法
    1:自然风干。2:吹风机吹干
    若一件衣服的水量小于mid,则自然风干就可以,否则。如果吹风机花费时间X。用于风干的时间为Y。吹风机一分钟可以吹干的水量为k,
    则可得到下面两式 :
    X+Y=mid。
    X+Y*k>=ai  ;
    由以上两式可得Y>=(ai-mid)/(k -1)(关键啊。)
    算出全部含水量大于mid的衣服的最小的Y(事实上就是把Y相加)得到sum ,最后sum与mid比較,return y<=mid就可以。

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int N=1e5+10;
    int a[N];
    int n,m,k;
    bool get(int mid)
    {
        int y=0;
        for(int i=0; i<n; i++){
            if(a[i]<=mid) continue;
            else{
                y+=ceil((double)(a[i]-mid)/(k-1));//一定要注意精度啊,不加ceil((double))会WA啊。
            }
            if(y>mid) return false;
        }
        return y<=mid;
    }
    int main()
    {
       // freopen("1.txt","r",stdin);
        scanf("%d",&n);
        int maxx=0;
        for(int i=0; i<n; ++i){
            scanf("%d",&a[i]);
            maxx=max(maxx,a[i]);
        }
        //cout<<"maxx=="<<maxx<<endl;
        scanf("%d",&k);
        if(k==1)printf("%d
    ",maxx);
        else{
            int ll=0,rr=maxx;
            for(int i=1; i<=100; i++){
                int mid=(ll+rr)/2;
                if(get(mid))rr=mid;
                else ll=mid;
            }
                printf("%d
    ",ll+1);
        }
        return 0;
    }


  • 相关阅读:
    本地及远程二级缓存
    ubuntu下使用golang、qml与ubuntu sdk开发桌面应用
    TCP之心跳包实现思路
    Java读书笔记1
    回文字符串
    6.1 遍历字符串
    linux系统文件夹的作用 good
    在线程中建立Form遇到的问题
    QTabWidget and QTabBar.的文字的颜色设置,三种方法
    Ring3下Hook NtQueryDirectoryFile隐藏文件
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6821239.html
Copyright © 2011-2022 走看看