题意:
蒸衣服,单位时间掉K单位的水。不蒸单位时间掉1单位的水。给定n件衣服的水量和K,求K的最小值。
题解:
最小化可行解。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[100000+5];
int n,k;
bool C(int x)
{
long long sum=0;
for(int i=0; i<n; i++)
if(a[i]>x)
{
sum+=ceil(double(a[i]-x)/(k-1));//需要蒸的时间
if(sum>x)return false;
}
return sum<=x;//x为可行解。即 x 时间所有衣服都干了!
}
int main()
{
while(cin>>n)
{
int INF=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i]>INF)INF=a[i];
}
cin>>k;
if(k==1){cout<<INF<<endl;return 0;}//蒸和不蒸效率一样
int lb=0;
int ub=INF+10;
while(ub-lb>1)
{
int mid=(ub+lb)/2;
if(C(mid))ub=mid;//最小化可行解
else lb=mid;
}
cout<<ub<<endl;
}
}