zoukankan      html  css  js  c++  java
  • POj-3104 Drying 二分+贪心

    题目大意:有n件湿的衣服,每件衣服都有相应的湿度,每分钟每件衣服的湿度减1(除了在烘干机里的衣服),现在有一个烘干机,烘干机一分钟可以让一件衣服的湿度降低k,问至少要花多少分钟才能使每件衣服的湿度为0

    解题思路:贪心的话,每分钟都要使用到烘干机。 
    枚举时间,如果湿度小于等于时间的话,就不用考虑了,在枚举时间内肯定会干的 
    如果湿度大于枚举时间的话,就要考虑一下了,该衣服要在给定时间内湿度变为零的话就要满足该式子,设已经过了cnt分钟了,当前这件衣服的湿度为num[i],枚举的时间为mid,那么 (num[i] - cnt) - n * k <= mid - cnt - n 也就是n =(num[i] - cnt) / (k - 1),如果有余数的话,时间还要+1;

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=100005;
    int maze[maxn];
    int Max,n,k;;
    int cmp(const int a,const int b){
        return a>b;
    }
    bool judge(int mid)
    {
        int Time=0;
        for(int i=0;i<n;i++)
        {
            if(maze[i]<mid)//maze递减,如果maze[i]<mid,则i和i后面的衣服一定可以晾干
                break;
            if(Time>mid)
                return false;
            Time+=(maze[i]-mid)/(k-1);
            if((maze[i]-mid)%(k-1))
                Time++;
        }
        return Time<=mid;
    }
    int solve()
    {
        int l=0,r=Max,mid;
        while(l<r)
        {
            mid=(l+r)/2;
            if(judge(mid))
                r=mid;
            else
                l=mid+1;
        }
        return r;
    }
    int main ()
    {
        while(~scanf("%d",&n))
        {
            for(int i=0;i<n;i++)
                scanf("%d",&maze[i]);
            scanf("%d",&k);
            sort(maze, maze+n, cmp);
            Max=maze[0];
            if(k<=1){
                printf("%d
    ",maze[0]);
                continue;
            }
            else printf("%d
    ",solve());
            
        }
        return 0;
    }


    想的太多,做的太少。
  • 相关阅读:
    英语口语练习系列-C15-心情不好
    英语口语练习系列-C14-常用片语
    英语口语练习系列-C13-聚会
    英语口语练习系列-C12-不了解
    英语口语练习系列-C11-了解
    Python3基础-分数运算
    英语口语练习系列-C10-up and down
    Python3基础系列-程序模板及代码本质
    英语口语练习系列-C09-常用动词
    英语口语练习系列-C08-考试
  • 原文地址:https://www.cnblogs.com/pealicx/p/6115661.html
Copyright © 2011-2022 走看看