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;
}