链接: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, 需要向下减位