CF287B Pipeline 题解

题意

\(n\) 个客户,一个水源和 \(k-1\) 个分离器,第 \(i\) 个分离器能将 \(1\) 股水流分离成 \(i+1\) 股水流,问最少使用多少个分离器能使 \(n\) 个客户都通水。如果不能就输出 \(-1\)

分析

首先看到数据范围的时候,能够想到应该是 \(\log_{2}k\) 的时间复杂度,并且通水的客户数随分离器数量的增加而增加,因此想到可以用二分枚举分离器的数量,判断是否能给 \(n\) 个客户通水,得到答案。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,ans; // 注意开long long
int check(ll mid)
{
    ll x=(2*k-(mid-1))*mid/2-mid+1; // 1个分离成k股水的分离器能使水的股数增加(k-1)
    return x>=n;
}
int main()
{
    scanf("%lld%lld",&n,&k);
    if(n==1) // 这里要特判一下,如果只有1个客户,那么不需要分离器
    {
        printf("0\n");
        return 0;
    }
    ans=-1;
    ll l=1,r=k-1;
    while(l<=r) // 二分
    {
        ll mid=(l+r)/2;
        int flag=check(mid);
        if(flag) // 符合条件,能给n个客户通水
        {
            ans=mid; // 更新答案
            r=mid-1; // 看看能不能用更少的分离器
        }
        else l=mid+1; // 只能使用更多的分离器
    }
    printf("%lld\n",ans);
    return 0;
}
posted @ 2022-02-18 11:15  l_x_y  阅读(40)  评论(0编辑  收藏  举报