2016计蒜之道复赛B题:联想专卖店促销

时间:2023-03-09 05:01:41
2016计蒜之道复赛B题:联想专卖店促销

题解

思路:

二分答案,设我们要check的值为x。

注意到每一个礼包都有,一个U盘,一个鼠标。

剩余的,分别为一个机械键盘,一个U盘,一个鼠标。

当礼包数目为x时,我们至多可以提供a-x个普通,b-x个幸运,c个豪华。能够使得相邻两个礼包不同的条件 等价于 最小值+次小值<=最大值+1,所以check的时候只需比较 最小值+次小值+min(最小值+次小值+1, 最大值)与x的大小关系即可。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int T;
int a, b, c;
vector<int> v;
bool check(int x) {
    v.clear();
    int aa = a - x; v.push_back(aa);
    int bb = b - x; v.push_back(bb);
    int cc = c; v.push_back(cc);
    sort(v.begin(), v.end());
    return v[0]+v[1]+min(v[0]+v[1]+1, v[2]) >= x;
}
int main() {
    cin >> T;
    while(T --) {
        cin >> a >> b >> c;
        int L = 0, R = b + 1;
        while(R - L > 1) {
            int mid = (L+R)>>1;
            if(check(mid)) L = mid;
            else R = mid;
        }
        cout << L << endl;
    }
}