装备合成

装备合成

https://ac.nowcoder.com/acm/problem/200211

二分、非线性规划

题意:

牛牛有{x}x件材料{a}a和{y}y件材料{b}b,用{2}2件材料{a}a和{3}3件材料{b}b可以合成一件装备,用{4}4件材料{a}a和{1}1件材料{b}b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。

分析

看到最大化想要用二分法解决,答案范围也已知,且答案具有单调性。即如果不能合成n件装备那也一定不能合成
n件以上的装备。

构建一个函数 int solve(int x,int y) 返回x件a物品,y件b物品下最多合成的装备个数。
初始化l = 0,r = 1e9
取mid = (l+r)>>1 如果能合成mid或mid以上的装备,让l = mid+1
反之令r = mid-1
最终答案一定会是l-1

那么问题的关键是如何判断是否能合成mid或mid件以上的装备呢?
假设我们要合成mid件装备
合成k件2a3b的,mid-k件4a1b的
则总消耗材料为:
k(2a + 3b) + (mid - k)(4a + b)
化简为: (4mid - 2k)a + (mid + 2k)b
那么对于这个式子就有一定要满足:

  1. 0 <= 4mid - 2k <= x
  2. 0 <= mid + 2k <= y
  3. 0 <= k <= mid(最初的条件)

我们对这三个式子进行一些合并会得到:

  1. 4mid - x <= 2k <= 2mid
  2. 0 <= 2k <= y - mid

则我们只要保证有k存在使其满足这个式子,那么就可以合成mid件装备!

如何满足呢我们令 tmp1 = max(4mid-x,0) tmp2 = min(2mid,y-mid)
那么只要存在 tmp1 <= 2k <= tmp2 的k 即可。
注意在这里因为k是整数,所以2k是偶数,因此
当tmp1==tmp2时 如果tmp1为奇数式子也是不成立的!!!
当tmp1<tmp2时一定成立

代码如下,注意细节

#include<iostream>;
#include<algorithm>;
using namespace std;
typedef long long ll;
const ll max_r = 1e9 + 100;
ll x, y;

int solve(ll x,ll y) {
    ll l = 0;ll r = max_r;
    while (l <= r) {
        ll mid = (l + r) >> 1;
        ll tmp1 = min(2 * mid, y - mid);
        ll tmp2 = max(4 * mid - x, (ll)0);
        if (tmp1 == tmp2 && (tmp1&1))
            r = mid - 1;
        else if (tmp1 >= tmp2)
            l = mid + 1;
        else r = mid - 1;
    }return l - 1;
}

int main() {
    ios::sync_with_stdio(0);
    int t;cin >> t;
    while (t--) {
        cin >> x >> y;
        cout << solve(x, y) << endl;
    }
}
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
20
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务