牛客练习赛59-c题 装备合成

题目(https://ac.nowcoder.com/acm/contest/4743/C)
牛牛有x件材料a和y件材料{b}b,用2件材料a和3件材料b可以合成一件装备,用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。

输入:
5
4 8
7 6
8 10
100 4555
45465 24124
输出:
2
2
3
50
13917
数据范围:
1<=t<=10000
1<=x,y<=1e9

题解:
可以看出数据范围很大,就算是一个for也会超时;这时,我的第一反应就是要么可以用数学方法解决,要么就是特殊情况;特殊情况很明显比想数学方法简单,所以我就尝试了几种特殊情况,发现真是这样;具体代码如下

#include
#include
using namespace std;
typedef long long
int main()
{
    ll  t,a,b,A,B,ans,x,y;
    cin>>t;
    while(t--)
    {
        cin>>a>>b;
        if(4*b<=a)ans=b;/*这种情况下,a比b多很多,把这些b全部用于合成第2件装备,即使b用完了,a也还有多余,因为第二件装备比第一件装备对b的需求少,所以,这种情况下最大值就是b*/
        else
        {
            if(3*a-2*b<0)ans=a/2;//(不等式变形一下就是a/2
            else
            {  //这就是a,b差距不大的情况,贪心考虑
                x=(4*b-a)/10,y=x+1;
                A=a-2*x,B=b-3*x;
                ans=x+min(A/4,B);
                A=a-2*y,B=b-3*y;
                ans=max(ans,y+min(A/4,B));
            }
        }
      cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(牛客练习赛59-c题 装备合成)