Drying POJ - 3104-------------------思维(二分)

28 篇文章 0 订阅
这篇博客探讨了一种衣物烘干问题的解决方案,通过二分枚举法找到最少的时间来烘干所有衣服。当烘干机每次能去除k水份时,算法会计算自然烘干与机器烘干的结合以达到最短总时间。对于k等于1的情况,只需选择最大烘干时间即可。文章还提供了一个C++实现的代码示例来解释这个过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

题意:
有n件衣服,每件衣服都有ai点水份。现在你可以自然烘干衣服每一分钟减少1点水份,或者你可以选择烘干机,每次烘干k水份,
问你最少需要多少时间可以把所有衣服烘干

解析:

二分枚举答案
假设一件衣服烘干需要x分钟,烘干机用了y分钟,那么自然干需要x-y分钟
所以: (x-y)+y*k>=a[i]
那么: y>=(a[i]-x)/(k-1)

假设二分答案为x分钟
那么对于<x分钟的都可以置为0,因为他们在x分钟内已经可以自然风干了

然后计算y即可,根据y值调动上下限

注意的是当k==1的时候,只要选择最大即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10000;
ll a[N],k;
ll b[N];
int n,tot;
bool check(ll x)
{

  ll ans=0;
  for(int i=1;i<=n;i++)  b[i]=a[i]-x;
  for(int i=1;i<=n;i++)
  {
    if(b[i]>0)
    {
      ans=ans+b[i]/(k-1)+(b[i]%(k-1));
    }
  }
  if(ans>x) return true;
  return false;
}
int main()
{
  while(~scanf("%d",&n))
  {
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    scanf("%lld",&k);
    sort(a+1,a+1+n);
    if(k==1)
    {
      cout<<a[n]<<endl;
      continue;
    }
    ll l=1,r=1e18;
    ll ans;
    while(l<=r)
    {
      ll mid=l+r>>1;
      if(check(mid)) l=mid+1;
      else r=mid-1;
    }
  //  printf("sample output #%d\n",++tot);
    cout<<l<<endl<<endl;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值