题解 | #小红的魔法药剂#

小红的魔法药剂

https://www.nowcoder.com/practice/1ede2daa3ab445bc8ac8ea62b6ca8201

小红收集魔法药剂 - 题解

题意精炼

种药剂,每种药剂有「红」「蓝」两种形态:

  • 直接购买:第 种红色药剂单价为
  • 调配合成:若已有「红色」的第 、第 种药剂,各消耗一瓶,可合成「蓝色」的第 种,合成本身不额外花费金币。

目标:使得最终对每个编号 至少拥有该药剂的任意一种形态(红或蓝),最小化总花费。

思路与结论

对每个编号 独立考虑一瓶“专属于 的药剂”的最小花费:

  • 要么直接买红色 :花费
  • 要么用两瓶红色 合成蓝色 :花费

于是对每个 的最优成本为: 将上述值对所有 直接求和即为答案。

关键点解释:题目允许购买任意数量的红色药剂;我们可以把“给第 种留的一瓶”独立出来计算成本(要么直接买一瓶红色 ,要么专门买一瓶红色 和一瓶红色 来合成一瓶蓝色 )。这些“为不同 预留的一瓶”之间互不共享,因此直接求和即得到全局最优。

正确性说明

将每个 的那“一瓶”视为互不共享的资源:

  • 若选择“红 ”,直接付
  • 若选择“蓝 ”,则为这瓶蓝 专门购入一瓶红 +一瓶红 ,付 。 两种方案中取较小者,彼此独立求和即可。任何试图“共用原料”的做法都会破坏“每个 至少一瓶”的独立性约束,不会比该独立最优更省。

复杂度

  • 时间复杂度:
  • 空间复杂度:(除输入存储外)

参考实现

#include <iostream>
using namespace std;
int a[202020];
int main() {
    int n,i;
    cin>>n;
    int res=0;
    for(i=1;i<=n;i++)cin>>a[i];
    for(i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        res+=min(a[i],a[x]+a[y]);
    }
    cout<<res;
}


全部评论
%%%
点赞 回复 分享
发布于 01-24 13:49 四川
感谢你的思路
点赞 回复 分享
发布于 2025-11-06 21:08 湖南

相关推荐

多多啊&nbsp;多多啊&nbsp;上来四道算法题算法题直播排序,整体比较简单把对象写出来,然后比较规则写明白就OK了。唯一一道A100%的电车充电如何最省钱,到目的地如何充电的钱最少,路上有充电站,每个电站价格不一样。用了DP来做,但感觉是贪心的样子,最后没招了,把不能到的情况给干了出来,过了8%日志分析纠错,滑动窗口,但我最后结果永远少一,过了15%没看,力竭了燃尽了多多&nbsp;以后牛客不用后台找我了,笔试夯爆了
淮竹c:不好意思,打扰大家🙏我是一个拼多多骑手,小电驴的最大电量为C,我的最大电量有1e9这么promax😭😭😭需要从x=0处走到x=L,L足足有1e9那么长处,途中有n个充电站,🙏🙏每个充电站的距离和电价分别为di和pi,初始电量是满的😭😭😭请告诉我到达终点最少要花多少钱😭😭😭求求大家把这些钱转给我
查看2道真题和解析
点赞 评论 收藏
分享
牛至超人:我将凌晨两点给你打电话
点赞 评论 收藏
分享
03-02 08:18
集美大学 Java
钱嘛数字而已:没有赛事奖项么?另外,项目经历字有点多哈,建议突出一下重点:用的什么技术,解决什么问题,达到什么效果。
大家都开始春招面试了吗
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

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