POJ-3104 Drying(贪心分析+二分)

题意

思路

这道题可以二分总的晾干时间,注意需要理解出题目的意思,就是一件衣服可以自然烘干,也可以使用散热器烘干。所以假设一件衣服最后的烘干时间是 x x x,那么我们可以假设自然烘干无时无刻不再进行,也就是说,其中有 x x x的水分被自然烘干,那么对于一件包含 a [ i ] a[i] a[i]水分的衣服来说:

  1. 假如 a [ i ] ≤ x a[i]\leq x a[i]x,那么就可以直接忽略掉,把宝贵的散热器留给其他衣服用
  2. 假如 a [ i ] > x a[i] > x a[i]>x,那么说明这件衣服除了自然烘干外,剩下的水分必须使用散热器烘干。而需要注意的是,我们在考虑自然烘干的时候,把其设置成了每时每刻都在进行,所以,在使用散热器的对水分蒸发的贡献时,需要去掉其中预先假定包含自然烘干的时间,也就是说,原来题意中的散热器每分钟蒸发 k k k水分,这时候单纯考虑散热器的作用时,要 − 1 -1 1,即减去其中自然蒸发的贡献。
  3. 最后我们看实际需要的烘干时间和二分预期的烘干时间之间的比较进行二分决策的转移
  4. 另外还要注意的是,这里的二分还是求的满足条件的最小下界

代码

void D(){
    int n;
    scanf("%d",&n);
    vector<ll> a(n,0);
    ll sum=0,ma=0;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
        ma=max(ma,a[i]);
    }
    ll k;
    scanf("%lld",&k);
    ll l=0,r=sum;
    if(k==1) {
        printf("%lld\n",ma);
        return;
    }
    //这里的二分是满足条件的下限
    while(l<r){
        ll mid=l+(r-l)/2;//需要的总时间
        ll cnt=0;//实际需要的时间
        for(int i=0;i<n;i++){
            if(a[i]<=mid) continue;
            cnt+=(a[i]-mid+k-2)/(k-1);
            if(cnt>mid) break;
        }
        if(cnt>mid) l=mid+1;
        else r=mid;
    }
    printf("%lld\n",l);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值