给你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;
}