3 题意:烤衣服,每分钟水量少k。自然干,每分钟少1. 4 给10^5件衣服的水量。 5 求最小的时间,全部的衣服都干了。 6 不能理解成,烤衣服的时候,也自然干。k已经包括了。 7 。对于烤衣服,把每分钟减少的水量看作k-1,这样就可以把所有衣服都当作一直在自然干就好了。
二分时间。对于每个时间判断是否合法可以这样:
水量少于时间x自然就干了,只看大于x的,然后累计(a[i]-x)(k-1) 要减x是因为当成在x时间内已经自然干了x份水,然后计算剩下的水要烘干多久 最终如果这样计算得到的时间大于x 则不合法,如果小于等于x 则合法
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
__int64 n,m;
__int64 a[100005];
__int64 slove(__int64 x)
{
__int64 ans=0;
__int64 it= upper_bound(a+1,a+1+n,x)-a;
for (__int64 i=it;i<=n;i++)
{
ans+=(a[i]-x)/(m-1);
if ((a[i]-x)%(m-1))
ans++;
}
if(ans<=x) return 1;
return 0;
}
int main()
{
__int64 i;
scanf("%I64d",&n);
__int64 sum=0;
for (i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
if (a[i]>sum) sum=a[i];
}
sort(a+1,a+1+n);
scanf("%I64d",&m);
__int64 l,r;
if (m==1)
{
printf("%d\n",sum);
return 0;
}
l=1,r=sum+1;
while(l<r)
{
__int64 k=(l+r)/2;
if(slove(k) )
r=k;
else
l=k+1;
}
printf("%I64d\n",l);
return 0;
}