现在的位置: 首页 > 综合 > 正文

POJ–3104–Drying【二分】

2018年04月24日 ⁄ 综合 ⁄ 共 1027字 ⁄ 字号 评论关闭

题意:有n个衣服,告诉你每件衣服的水份,每秒减一,有一个烘干机每秒能给一个衣服减k的水份,问最少要多少时间把衣服全部晾干。

二分答案,然后判断正确性,设第 i 件衣服有a[ i ]的水份,对于二分的答案mid,如果a[ i ]  < = mid ,自然风干就行了,如果a[ i ] > mid,设它自然风干时间为t1,用机器耗时t2,则有 t1 + t2 = mid 、 t1 + t2 * k >= a[ i ],联立得 t2 >= (a[ i ] - mid) / (k - 1),再把所有a[ i ] > mid 的时间加起来和 mid 比较。

如果mid 能满足条件,还要看mid - 1是否满足,以得到最优解。

#include<cstring>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#define PI acos(-1.0)
using namespace std;
#define MAXN 100005

int n,k;
int a[MAXN];
int maxm,sum;
bool check(int mid){
    int i;
    double m = 0;
    for(i=0;i<n;i++){
        if(a[i] > mid){
            m += ceil(double((a[i] - mid))/double((k - 1)));
        }
    }
    if(m <= mid)    return true;
    else    return false;
}
void solve(){
    int l = 0;
    int r = maxm;
    int mid = (l+r) >> 1;
    while(l<=r){
        if(check(mid)){
            if(!check(mid-1)){
                sum = mid;
                return ;
            }
            r = mid - 1;
        }
        else    l = mid + 1;
        mid = (l + r) >> 1;
    }
}
int main(){
    int i;
    maxm = sum = 0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(a[i]>maxm)   maxm = a[i];
    }
    scanf("%d",&k);
    if(k==1)    printf("%d\n",maxm);
    else{
        solve();
        printf("%d\n",sum);
    }
    return 0;
}

抱歉!评论已关闭.