1. 程式人生 > >POJ-3104 Drying(二分

POJ-3104 Drying(二分

題目連結:http://poj.org/problem?id=3104

題意:你有n件衣服需要烘乾,每件衣服給出溼度。你現在有一個烘乾機,每次可以烘乾k點溼度,求輸出烘乾所有衣服所需最少的時間。

思路:二分最少時間,如果當前衣服大於時間,我們考慮使用烘乾機,求出所有衣服烘乾所需時間,如果<=mid 我們儲存mid,繼續往更少的時間二分即可

#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
const
int maxn = 100005; ll a[maxn]; int main() { int n; while(~scanf("%d",&n)) { ll Max=0; for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); Max=a[i]>Max?a[i]:Max; } ll k; scanf("%lld",&k); if(k==1) { printf(
"%d\n",Max); continue; } ll l=1; ll r=Max; ll ans=0; while(l<=r) { ll mid=(l+r)>>1; ll sum=0; for(int i=1; i<=n; i++) { if(a[i]>mid) { ll xx
=ceil((a[i]-mid)*1.0/(k-1)); sum+=xx; } } if(sum<=mid) { ans=mid; r=mid-1; } else l=mid+1; } cout<<ans<<endl; } }
View Code

 

 

 

 

 

PS:摸魚怪的部落格分享,歡迎感謝各路大牛的指點~