PKU3104 Drying
問題はこちら 3104 -- Drying.
k = 1 のときは自然乾燥と同じなので,a0 〜 an-1 の中で最大のものが答えになる.
k > 1 のときは,全部の服を乾かすのに必要な最小時間を二分探索で求める.
ai を x 分で0にするのに必要な,乾燥機の使用時間を ti とおく.
乾燥機によって減らされる水分量は k ・ ti .
自然乾燥で減る水分量は x - ti .
この2つの和が ai 以上であれば良いので k ・ ti + x - ti >= ai .
これより ti >= (ai - x) / (k - 1) が得られる.
次に,a0 〜 an-1 全部を x 分で乾かすための条件を考える.
乾燥機は1度に1つの服しか乾かせないので全部の服を x 分で乾かすための乾燥機の使用時間は,合計で t0 + t1 + … + tn-1 分になる.
これが x 以下であれば全部の服を x 分で乾かすことができる.
具体例 a = { 6, 13, 17 } , k = 5 でみてみる.
x = 10 のとき
t0 = 0
t1 = 1
t2 = 2
余裕で間に合う.
x = 5 のとき
t0 = 1
t1 = 2
t2 = 3
それぞれを5分で乾かそうとすると,乾燥機を6分使うことになるから無理.
#include <cstdio> #include <algorithm> using namespace std; int a[100010],n,k; bool ok(int x) { long long sum=0; for (int i=0;i<n;++i) if (a[i]>=x) { int t=(a[i]-x+k-2)/(k-1); sum+=t; } return sum<=x; } int main() { scanf("%d",&n); for (int i=0;i<n;++i) scanf("%d",a+i); scanf("%d",&k); if (k==1) { printf("%d\n",*max_element(a,a+n)); return 0; } int L=0,R=1000000000; while (L<=R) { int M=(L+R)/2; if (ok(M)) R=M-1; else L=M+1; } printf("%d\n",L); return 0; }