链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
牛牛有x件材料a和y件材料b,用2件材料a和3件材料b可以合成一件装备,用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。
输入描述:
输入包含t组数据 第一行一个整数t 接下来t行每行两个整数x,y
输出描述:
每组数据输出一行一个整数表示答案。
输入
5
4 8
7 6
8 10
100 4555
45465 24124
输出
2
2
3
50
13917
备注:
1<=t<=10000{1<=t<=10000}1<=t<=10000
1<=x,y<=1e9{1<=x,y<=1e9}1<=x,y<=1e9
思路
使用方案1合成装备的数量与合成装备的总数量关系如图所示。
设需要用方案一制造装备m件,消耗a材料(2*m)件,消耗材料b(3*m)件。
那么使用方案二制造装备数为min((x - 2 * m) / 4,(y - 3 * m) / 1)。
我们可以使用二分的方法来寻找m。
比较mid与mid + 1制造的装备总数,如果m = mid时制造的装备总数小于m = mid + 1时制造的装备总数,则mid在峰值的左侧,否则在峰值的右侧,找到峰值时,即为可以制造装备总数的最大值。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y;bool check(int mid)
{int xx1 = x - (2 * mid);int yy1 = y - (3 * mid);if(xx1 < 0) return true; if(yy1 < 0) return true;int res1 = min(xx1 / 4, yy1 / 1);res1 += mid;mid ++;int xx2 = x - (2 * mid);int yy2 = y - (3 * mid);if(xx2 < 0) return true; if(yy2 < 0) return true;int res2 = min(xx2 / 4, yy2 / 1);res2 += mid;if(res1 > res2) return true;else return false;}void solve()
{cin >> x >> y;int l = 0, r = 1e9;while(l < r){int mid = (l + r) >> 1;if(check(mid)) r = mid;else l = mid + 1;}int xx1 = x - (2 * l);int yy1 = y - (3 * l);int res1 = min(xx1 / 4, yy1 / 1);cout << l + res1 << endl;
}int32_t main()
{int T;cin >> T;while(T --)solve();return 0;
}