链接:https://ac.nowcoder.com/acm/contest/22353/1020 来源:牛客网
牛牛有 𝑥 x件材料 𝑎 a和 𝑦 y件材料 𝑏 b,用 2 2件材料 𝑎 a和 3 3件材料 𝑏 b可以合成一件装备,用 4 4件材料 𝑎 a和 1 1件材料 𝑏 b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void deal() {
ll x, y;
cin >> x >> y;
auto check = [&](ll mid) -> bool {
ll t1 = (4 * mid - x + 1) / 2, t2 = (y - mid) / 2;
if(y - mid < 0) t2 = (y - mid - 1) / 2;
if(max((ll)0, t1) <= min(mid, t2)) return true;
else return false;
};
ll l = 0, r = 1e9;
while(l <= r) {
ll mid = l + r >> 1;
if(check(mid)) l = mid + 1;
else r = mid - 1;
}
cout << r << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin >> t;
while(t --)
deal();
return 0;
}
此题细节注意, check 函数
ll t1 = (4 * mid - x + 1) / 2, t2 = (y - mid) / 2;
if(y - mid < 0) t2 = (y - mid - 1) / 2;
一定要写成这样, 因为计算机整除的原因, 会向下整除 t1 = (4 * mid - x + 1) / 2; 往上进位 因为 在 y < mid 的时候, 明明是 -1, 现在显示 0, 需要向下减位