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;
}


想的太多,做的太少。
原文地址:https://www.cnblogs.com/pealicx/p/6115661.html