牛牛有x件材料a和y件材料b,用2件材料a和3件材料{b}b可以合成一件装备,用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。
三分算法学习链接
转至(https://www.cnblogs.com/techflow/p/12131376.html)
很多题解都是用的三分,但没有说明为什么可以用3分,也就是没有证明答案是一个凸函数,或者凹函数
证明
设:以2a,3b方式合成的装备有m件 以4a,b方式合成的装备有n件
m取值范围为 0 ~ min(x/2,y/3),
合成的装备总数就是
F(m) = m + min((x-2,)/4,y-3m);
为分段函数,拆掉min得到
F(m) = (x+2m)/4, 10m <= 4y -x;
F(m) = y - 2m ,10 > 4y - x;
函数F(m)关于m从左到右先增后减,为凸函数,所以可以对函数F(m)使用三分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll x,y,T;
ll l,r,m1,m2;
cin >> T;
ll cnt = 0;
for(int t = 0;t < T;t++){
cin >> x >> y;
l = 0;
r = min(x/2,y/3);
while(l < r){
m1 = l + (r-l)/3;
m2 = r - (r-l)/3;
ans1 = m1 + min((x-2*m1)/4,y-3*m1);
ans2 = m2 + min((x-2*m2)/4,y-3*m2);
if(ans1 > ans2)
r = m2-1;
else
l = m1+1;
}
cout << l + min((x - 2*l)/4,y - 3*l) << endl;
}
return 0;
}