Drying POJ3104
投稿日: 更新日:
問題:http://poj.org/problem?id=3104
問題
枚の服があります。番目の服はの量の水を含んでいます。これから服を乾かします。乾燥機を使わない場合は毎分1だけ含んでいる水の量は減っていきます。乾燥機を使う場合、1分でだけ水の量を減らせます。乾燥機は1台のみで1回につき1枚しか使えません。全ての服を乾かすのに最短で何分かかるでしょう。
水の量は0を未満にはなりません。
解法
分以内で乾かせるかを2分探索します。
の場合は乾燥機を使う必要はありません。
の場合、乾燥機を使う必要があります。乾燥機を1回使うことによって、かかる時間を分短縮することができます。前提条件より、乾燥機は同時に使えないため、使う回数だけ時間を要旨ます。つまり、回以上使う場合は分以内に全ての服を乾かすことは出来ません。
乾燥機を使う回数は以下の式で求まります。の時。
で割るのでの時のみ別の処理を書かなければなりません。
実装
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> a(n);
for(int i = 0;i < n; ++i){
cin >> a[i];
}
int k;
cin >> k;
if(k == 1){
int ans = 0;
for(int i = 0;i < n; ++i){
ans = max(ans, a[i]);
}
cout << ans << endl;
return 0;
}
int ok = 1e9, ng = 0;
while(ok - ng > 1){
int mid = (ok + ng)/2;
long long count = 0;
for(int i = 0;i < n; ++i){
if(a[i] <= mid)continue;
count += (a[i] - mid + (k-2)) / (k-1);
}
if(count <= mid){
ok = mid;
}else{
ng = mid;
}
}
cout << ok << endl;
return 0;
}