装备合成 三分

题目链接

链接:https://ac.nowcoder.com/acm/contest/18907/N
来源:牛客网

题目描述

在这里插入图片描述

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



解析

使用三分的使用一定要注意要么这是个二次函数,要么这是个分段的凹凸函数,千万不能把两条斜率不同但作用域重合了的直线合并出来的函数盲目的看成一个凹凸函数
本题其实也可以对极值点的两边分别二分求最优解

证明

设:以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, m <= (4y -x)/10;
F(m) = y - 2m ,m > (4y - x)/10;

函数F(m)中x,y为常数,所以F(m)关于m从左到右先增后减,为凸函数,所以可以对函数F(m)使用三分


三分算法使用技巧

这里有一个三分的技巧,考虑到整数除法的小数丢失,所以你最后得到的是近似点,可能不是真正的极值点,但它一定非常靠近极值点,这时你只要枚举一下近似点的附近的那几个点就行

code

#include<bits/stdc++.h>
using namespace std;
int main(){
    int T;    cin >> T;
    while(T--){
        int x,y;    cin >> x >> y;
        int l,r,m1,m2;
        l = 0; r = min(x/2,y/3);
       
        while(l < r){
            m1 = l + (r - l)/3;
            m2 = r - (r - l)/3;
            int ans1 = m1 + min( (x - 2 * m1)/4, y - m1 * 3);
            int ans2 = m2 + min( (x - 2 * m2)/4, y - m2 * 3);
            
            if(ans1 >= ans2)
                r = m2 - 1;
            else l = m1 + 1;
        }
        
        int ans = 0;
        int ma = min(x/2,y/3);
        
        for(int i = max(0,l - 3) ; i <= min(l + 3,ma); ++i)//枚举近似点范围的所有点
            ans = max(ans,i + min( (x - i * 2)/4, y - i * 3));
        cout << ans << endl;
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity中使用UGUI实现装备合成树的步骤如下: 1. 设计装备合成树的结构:装备合成树是一个有层级关系的树形结构,每个节点代表一个装备,节点之间通过合成关系连接。可以使用脚本或者数据结构来定义装备节点和合成关系。 2. 创建UI界面:在Unity中创建一个Canvas对象,并添加需要的UI元素,比如按钮、文本等,用来显示装备合成树。 3. 绘制节点:使用UGUI提供的Button或者Image等UI组件,绘制每个装备节点的图标,并设置对应的合成信息和按钮事件等。 4. 布局节点:根据装备合成树的结构,将装备节点按照层级和位置进行布局,可以使用UGUI中的Layout组件来实现自动布局。 5. 添加交互:为每个装备节点的按钮添加事件监听,当点击某个装备节点时,根据节点的合成信息刷新树的显示内容,比如显示合成材料和合成结果等。 6. 更新合成树:当成功合成某个装备后,需要更新装备合成树的结构和显示内容,可以使用脚本来实现树的动态更新。 7. 状态管理:根据游戏逻辑和玩家行为,需要考虑装备合成树节点的状态管理,比如显示已拥有的装备节点和未解锁的装备节点等。 8. 界面优化:为了提升用户体验,可以考虑添加特效、动画和过渡效果等,使装备合成树的界面更加活跃和吸引人。 通过上述步骤,在Unity中使用UGUI可以实现一个功能完善的装备合成树界面,为玩家提供更好的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值