题目
题目描述:
牛牛有x件材料a和y件材料b,用2件材料a和3件材料b可以合成一件装备,
用4件材料a和1件材料b也可以合成一件装备。
牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。
输入描述:
输入包含t组数据
第一行一个整数t
接下来t行每行两个整数x,y
输出描述:
每组数据输出一行一个整数表示答案。
解析
不难看出,答案具有单调性,当能合成m件装备时也一定能合成[0,m-1]件,所以这题可以用二分,把求值问题转化为验证问题,关键在于如何验证枚举的mid是否满足条件。
对于每mid件装备,假定合成了k件装备1,则合成了mid-k件装备2,根据题意得到如下两个公式:
2k+4(mid-k) <=x ①
3k+ (mid-k) <= y ②
k在[0,mid]的范围内,同样可以二分k的取值,当公式①和公式②同时成立时说明可以合成mid件装备,当公式①不成立时扩大k值,否则缩小k值,不存在k同时满足①、②时说明不能合成mid件装备
AC代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll x,y,l,r,mid; bool solve(ll a){ ll l1,r1,mid1; l1=0,r1=a; while(l1 <= r1){ mid1=(l1+r1)>>1; if((4*a-2*mid1) <= x && (a+2*mid1) <= y) return true; if((4*a-2*mid1) > x) l1=mid1+1; else r1=mid1-1; } return false; } int main(){ int t; cin>>t; while(t--){ l=0,r=1000000000; scanf("%lld%lld",&x,&y); while(l <= r){ mid=(l+r)>>1; if(solve(mid)) l=mid+1; else r=mid-1; } cout<<r<<endl; } }