poj 3104 二分想法

给你n个数表示含水量,给你一个k表示每分钟洗衣机能脱水k滴     每分钟没有在洗衣机的衣服自动脱水一滴,求把全部水托干最小时间,怎么都没想到居然是二分;==!!

好吧,二分枚举最小时间mid,然后求实际所需时间再 经行判断,   如果枚举时间为mid,对每件衣服num【i】 如果num【i】小于mid   很显然直接自然干最好  而对于num【i】大于mid所用时间为t,设自然干时间为x1  用洗衣机的时间为x2,  很显然   x1+x2小于等于mid   x2*k+x1小于等于num【i】  可以求出t小于等于(num【i】-mid)/(k-1)   这里要注意应为衣服一定要全干  **所以存在一个取整的操作**    把所有t加起来与mid判断就ok了


#include<stdio.h>
#include<string.h>
#include<cmath>
#include<iostream>
using namespace std;

__int64 num[100010];
int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int n,i,j,k;
	while(~scanf("%d",&n))
	{
		__int64 left=1,right=0,mid;
		
		for(i=1;i<=n;i++)
		{
			scanf("%I64d",&num[i]);
			right=max(right,num[i]);
		}
		scanf("%d",&k);
		if(k==1) printf("%I64d\n",right);
		else
		{
			__int64 ans;
			while(left<=right)
			{
				mid=(left+right)/2;
				__int64 sum=0;
				for(i=1;i<=n;i++)
				if(num[i]>mid) 
				{
					sum+=ceil((double)(num[i]-mid)/(double)(k-1));
				}
				if(sum<=mid)
				{
					ans=mid;
					right=mid-1;
				}
				else left=mid+1;
			}
			printf("%I64d\n",ans);
		}
	}	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值