【算法】装备合成(二分)

链接:登录—专业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;
}

  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只大黄猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值