poj 2104 Drying

题目链接

题意:有一些衣服要晾干,你有一个吹风机可加快晾干速度,问最少多长时间

思路:二分需要的时间,检查在需要的时间内没见衣服能否晾干,如不能晾干,则用吹风机,并计算使用吹风机的时间,(注意这里有几个坑),两种时间的比较作为二分的条件


#include<stdio.h>
#include<iostream>
#include<math.h>
#include<cstring>
typedef long long ll;
using namespace std;
ll a[100005];
ll n,d,k;

int main()
{
    //freopen("in.txt","r",stdin);
	ll n;
	while(scanf("%lld",&n)!=EOF)
	{
        ll ma=0;     //用于保存最大值,不要忘记赋初值啊啊啊啊啊啊  
        for(ll i=0;i<n;i++)
        {
            scanf("%lld",&a[i]);
            ma=max(a[i],ma);
        }
        scanf("%lld",&k);
        if(k==1)
        {
            printf("%lld\n",ma);
            continue;
        }
        ll low=1,high=ma,mid=0,sum=0,ans=0;
        while(high>=low)
        {

        	sum=0;
        	mid=(high+low)/2;
        	for(ll i=0;i<n;i++)
        	{
        		ll tmp=a[i]-mid;
        		if(tmp>0)
        			sum+=(tmp%(k-1)==0?tmp/(k-1):tmp/(k-1)+1);//注意这里是k-1,不是k
        			//sum+=ceil(tmp*1.0/(k-1));   //两个式子意义相同,经测试,上式稍微快一点
        	}

            if(sum<=mid)
            {
                ans=mid;    //注意保存有效的mid值,else情况下sum的取值会大于mid,不符合实际
                high=mid-1;
            }
            else
            	low=mid+1;
        }

        printf("%lld\n",ans);
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值