CF2091D Place of the Olympiad

· · 题解

题目传送门

思路

这题很明显可以用二分答案。

每次检查以 mid 为最长长度的长凳的凳子数量是否不小于 k。若成立则保存答案且移动右端点,否则移动左端点。

AC Code:

#include <bits/stdc++.h>
using namespace std;
long long n,m;
long long k;
bool check(int x)
{
    long long r=n*((m/(x+1)*x)+(m%(x+1)));
    return r>=k;
}
void solve()
{
    cin >>n>>m>>k;
    long long l=1,r=m;
    long long ans=0;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(check(mid))
        {
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    cout <<ans<<'\n';
}
int main()
{
    int t;
    cin >>t;
    while(t--)
    {
        solve();
    }
    return 0;
}