Dying[二分]

来源:互联网 发布:磁条卡写卡软件 编辑:程序博客网 时间:2024/06/05 08:29

题意:给n件衣服去晒干,自然干每分钟-1, 烘干每分钟-k,给定n个数字和k,求最小烘干时间。(烘干机每个时刻只能烘一件衣服)
思路:数据范围1e5找nlogn的算法,二分时间。
二分的单调性:如果能在T时间内完成任务,则在任意ti<T时间内也都能完成任务。
二分的check(mid):一件衣服能的湿度小于等于mid,则无需用烘干机,否则设烘干的时间需要x1,风干x2,则有ai=kx1+x2,化简得到(aimid)/(k1)=x1
所以累加x1得到烘干机工作总时间,与mid相比判断得到check

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<bitset>#include<algorithm>#include<map>#include<set>#include<queue>#include<vector>#include<cstdlib>#include<list>#include<stack>#include<cmath>#include<iomanip>using namespace std;//#pragma comment(linker, "/STACK:1024000000,1024000000")typedef long long LL;void debug() {cout << "ok running!" << endl;}\int a[100005], n, k, m;bool check(int mid){    int flag = 1;    int sum = 0;    if(k == 1) return mid>=m;    for(int i = 0; i < n; ++i)    {        if(a[i] <= mid) continue;        sum += (a[i]-mid+k-2)/(k-1);        if(sum > mid)        {            flag = 0;            break;        }    }    return flag;}int main(){    ios::sync_with_stdio(false);    #ifndef ONLINE_JUDGE    freopen("input.txt", "r", stdin);    #endif // ONLINE_JUDGE    while(cin >> n)    {        m = 0;        for(int i = 0; i < n; ++i)        {            cin >> a[i];            m = max(m, a[i]);        }        cin >> k;        int l = 0, r = m;        int ans = -1;        while(l <= r)        {            int mid = (l+r) >> 1;            if(check(mid))            {                ans = mid;                r = mid-1;            }            else l = mid+1;        }        cout << ans << endl;    }    return 0;}