poj 3104 Drying 二分答案

时空隧道


题目大意:
有n件衣服,每件衣服有一个湿度值a[i],每个单位时间每件衣服可以自然蒸发一点湿度值,现在有一台烘干机,每个单位时间可以使一件衣服减少k点湿度值(烘干期间不会自然蒸发),最少需要多长时间可以使得所有衣服都干掉


分析:
二分答案
为什么这道题要使用二分?
首先这道题是一个最优值问题,也就是最大值最小的问题
其次答案是单调的,满足二分性质
所以此题可以转化为二分答案判断可行性的问题
对于ans,如果a[i]<=ans,那么就让i自然蒸发,否则就要使用ceil(a[i]-ans])/(k-1)时间的烘干机,判断使用烘干机的时间是否满足ans


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int maxn=100000+5;
int n,a[maxn],k,mx=0;
inline bool check(int tim){
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(a[i]>tim)
            cnt+=(a[i]-tim+k-1)/k;
    if(cnt>tim)
        return false;
    return true;
}
signed main(void){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]),mx=max(mx,a[i]);
    scanf("%lld",&k);
    k--;
    if(k==0){
        cout<<mx<<endl;
        return 0;
    }
    int l=0,r=mx,ans;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid))
            ans=mid,r=mid-1;
        else
            l=mid+1;
    }
    cout<<ans<<endl;
    return 0;
} 

by >_< neighthorn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值