装备合成 三分 证明为凸函数

题目链接

牛牛有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;
}

猜你喜欢

转载自blog.csdn.net/RunningBeef/article/details/113836764