目录
D - Can you solve this equation?
A - Drying
题意:
简决定用散热器来加快干燥速度。但是散热器很小,所以一次只能装一件东西。
Jane希望在尽可能短的时间内进行干燥。她让你写一个程序来计算一套衣服的最短时间。
简刚洗了n件衣服。他们每个人在洗衣服的时候都喝了ai水。每分钟,每件物品中所含的水量就会减少一(当然,只有当物品尚未完全干燥时)。当所含水量为零时,布料变干,准备包装。
Jane每分钟都可以选择一件东西放在散热器上晾干。散热器非常热,所以这件东西的水量在这一分钟减少了k(但不小于零-如果东西的含水量小于k,那么产生的水量将为零)。
其任务是通过有效使用散热器,使干燥总时间最小化。当所有的衣服都干了之后,干燥过程就结束了。
思路:
这题要考虑自然风干时间和烘干机烘干的时间
存在一个值m,使得烘干的水量为(m-s)+s*k的和最小。m为烘干衣服所用时间,s为自然风干的时间。也就是说现在要求的是 a[i]=(m-s)+s*k 即 s=(a[i]-m)*1.0/(k-1);
注意,如果说k==1,分母就为0了,所以k=1的情况要特判
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define exp 1e-6
#define pi acos(-1.0)
using namespace std;
long long int a[maxn],maxx,sum,k;
int main()
{
//ios::sync_with_stdio(false);
int n,i;
long long low,high,mid;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
maxx=0;
for(i=0; i<n; i++)
{
scanf("%lld",&a[i]);
if(a[i]>maxx)
maxx=a[i];
}
scanf("%d",&k);
if(k==1)
{
printf("%lld\n",maxx);
continue;
}
low=1,high=maxx;
long long res=0;
while(high>=low)
{
mid=(high+low)/2,sum=0;
for(i=0; i<n; i++)
{
if(a[i]>mid)
{
long long s=ceil((a[i]-mid)*1.0/(k-1));
sum+=s;
}
}
if(sum<=mid)
{
res=mid;
high=mid-1;
}
else