Codeforces 1221C(推公式\二分查找)

https://codeforces.com/problemset/problem/1221/C
本题实际上是说有三种人,分别有,,个,从中取出三个人,要求一个人是第一种,一个人是第二种人,问最多能取多少组人?
法一:(推公式)若,不妨设,若把比多出来的部分当成,不影响结果。因为,要想尽可能多取,只能一个个取,而多出来的只能用来凑数,所以先处理成。
考虑每一组的组成,只能是以下三种:。由于可以被替代,所以先取。如果,则全取完,此时。反之取完后还剩下,此时,然后这样的轮流取,直到取不了为止,取了组,共计组。
又和等价,故。
这个命题可以推广到。
法二:(二分查找)显然,又总共有个人,一组有个人,所以。所以可以从里找的最大,即为所求。

#include
#include
using namespace std;
int q;
int c, m, x;
int res;
int main() {
    cin >> q;
    while (q--) {
        cin >> c >> m >> x;
        int l = 0, r = min(c, m);
        res = 0;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (mid * 3 <= (c + m + x)) {
                res = mid;
                l = mid + 1;
            }
            else {
                r = mid - 1;
            }
        }
        cout << res << endl;
    }
}

你可能感兴趣的:(Codeforces 1221C(推公式\二分查找))