hdu 3810 Magina 队列模拟0-1背包

ic后端学习笔记-floorplan floorplan是布图规划,规划包括定义芯片的大小,定义芯片内各种模块、hard macros(硬核。比如RAM,ROM及其他IP模块等)、IO等的大小和位置,有时候还需要提前定义一些placement blockages,groups/regions等等,是后端设计的第一步,也是后续所有P&R工作的基础。floorplan与placement的区别是。 阅读详情

题意:

出一些独立的陆地,每片陆地上有很多怪物,杀掉每个怪物都需要一定的时间,并能获得一定的金钱,给出指定的金钱m, 求最少要多少时间可以得到m金钱,仅能选择一个陆地进行杀怪。

题解:

这题,如果不管数据范围,很容易想到对每片陆地求一次0-1背包(dp(i, j) = min(dp(i-1, j), dp[i-1, j-money] + time), i 为金钱),然后在所有陆地中找出最少的时间即为答案,但是这题的数据范围太大金钱m可达到1e9, 所以不能单纯的直接用数组模拟,考虑第i个怪物,要更新第i个怪物,只需要知道两个状态,那就是dp[i-1][j], 和dp[i-1][j-money], 所以,我们只需要保存第i-1个怪物的所有合法状态,就能更新第i个怪物的状态, 所以我们可以考虑使用两个优先队列来维护上一轮的状态和这一轮的状态,就能找到答案了。首先,将两个队列都按照money从大到小,time从小到大的顺序排列,每次把q1全部出队列更新下一个状态,并把两个状态都放入q2中,然后从q2中选择最优解再复制到q1中,最后更新ans即可。

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef vector<int>::iterator Pointer;
const int maxn = 60;
const int inf = 1e9;
vector<int> group[maxn];
vector<int> mp[maxn];
int n, m, gcnt;
struct node
{
    LL tm, val;
    node() {}
    node(LL tm, LL val) : tm(tm), val(val) {}
    bool operator < (const node& tmp) const
    {
        return val < tmp.val || (val == tmp.val && tm > tmp.tm);
    }
}arr[maxn], now, nxt;
void init()
{
    for (int i = 0; i < maxn; ++i) group[i].clear(), mp[i].clear();
}
bool vis[maxn];
void dfs(int u)
{
    group[gcnt].push_back(u);
    vis[u] = true;
    for (Pointer it = mp[u].begin(); it != mp[u].end(); ++it)
    {
        int v = *it;
        if (!vis[v])
        {
            dfs(v);
        }
    }
}
void divide_group()
{
    memset(vis, false, sizeof vis);
    gcnt = 0;
    for (int i = 1; i <= n; i++)
    {
        if (!vis[i])
        {
            dfs(i);
            gcnt++;
        }
    }
}

priority_queue<node> q1, q2;
inline void clear_queue()
{
    while (!q1.empty())
    {
        q1.pop();
    }
    while (!q2.empty())
    {
        q2.pop();
    }
}
LL mint;
void zeroOnePack(int team)
{
    for (Pointer it = group[team].begin(); it != group[team].end(); ++it)
    {
        int v = *it;
        while (!q1.empty())
        {
            now = q1.top(), q1.pop();
            q2.push(now);
            nxt = node(now.tm+arr[v].tm, now.val+arr[v].val);
            if (nxt.val >= m && nxt.tm < mint)
            {
                mint = nxt.tm; continue;
            }
            if (nxt.tm >= mint) continue;
            q2.push(nxt);
        }
        LL pre = inf;
        while (!q2.empty())
        {
            node tmp = q2.top(); q2.pop();
            if (tmp.tm < pre)
            {
                pre = tmp.tm;
                q1.push(tmp);
            }
        }
    }
}
LL solve()
{
    mint = inf;
    
    for (int i = 0; i < gcnt; i++)
    {
        now = node(0, 0);
        clear_queue();
        q1.push(now);
        zeroOnePack(i);
    }
    
    return mint == inf ? -1 : mint;
}
int main()
{
//    freopen("/Users/apple/Desktop/in.txt", "r", stdin);
    
    int t, kase = 0; scanf("%d", &t);
    
    while (t--)
    {
        scanf("%d%d", &n, &m);
        init();
        for (int i = 1; i <= n; i++)
        {
            int k; scanf("%lld%lld%d", &arr[i].tm, &arr[i].val, &k);
            for (int j = 0; j < k; j++)
            {
                int v; scanf("%d", &v);
                mp[i].push_back(v);
            }
        }
        divide_group();
        LL ans = solve();
        printf("Case %d: ", ++kase);
        if (ans == -1)
        {
            printf("Poor Magina, you can't save the world all the time!\n");
        }
        else
        {
            printf("%lld\n", ans);
        }
    }
    
    
    
    
    return 0;
}


【MUJOCO控制篇-2】控制一个简单的机械臂 本篇博客将逐步分析和解释如何通过Python代码使用MuJoCo库来控制一个机械臂模型。我们将从加载模型开始,逐步深入到PID控制器的实现,最后讨论如何实现轨迹跟踪功能。上期内容为如何建模一个简单的机械臂模型,本篇文章将基于上篇内容进行深入探讨如何实现一个简单的控制。 阅读详情

相关推荐

SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)

SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。

nan620403的博客 1081

HDU 3810 Magina (优先队列+DFS 实现01背包)

Magina 题目链接:HDU 3810 Magina 某些怪物是联通的,Magina每次只能选择一个堆进行打怪,也就是分组的01背包,最后如果有解的话,肯定是在打某个堆的某些怪物。因为这个题的时间最大为10亿,我们不能开一个10亿大小的数组。所以用优先队列解决01背包问题,同时进行减枝。 怎么用优先队列解决01背包,思想可以看如下链接: 优先队列式分支限界法 AC代码: #include<cstdio> #include<cstring> #include<a.

热爱编程,热爱技术 483

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022

HDU - 3810 Magina (并查集+优先队列优化背包)

题意: 有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。 分析: 如果题目数据范围小点,那么就是一个01背包的板题了,只要在连通块上进行背包就可以了,但是题意M最大是1e9,显然得考虑优化策略,因为自己的知识有限,所以参考的大佬的优化方法,很机智,用优先...

兜率工的博客 528

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

伶俐角少儿编程 464

innovus:ccopt_design分段长tree操作

这步don't touch保证后面完整cts尽量不会动到已经长过的tree。需要给sub tree手写一个spec,参考create_ccopt_clock_tree_spec -file的写法,只写create_ccopt_clock_tree和skew group部分就行。

m0_61544122的博客 1676

hdu 3810 超大容量背包(n=50不是40)

先贴一个挑战上解决n=40时的超大容量背包,不过解决n=50时会TLE和MLE #include #include #include #include #define MIN(x,y) ((x)>(y)?(y):(x)) using namespace std; const long long INF=5010000000000; vectorQ[100]; pairps[1<<21]; int

sky_zdk的博客 576

【AI黑话日日新】什么是AI云原生?

云原生赋能AI:利用容器、微服务、Serverless、DevOps等云原生技术,解决AI应用(尤其是大模型)在部署、扩展、运维、成本控制方面的痛点,让AI服务具备高可用、高性能、易运维、易扩展的特性AI赋能云原生:将AI技术(如智能调度、异常检测、自动优化)融入云基础设施管理,使云平台具备自我感知、自我优化、自我修复的能力,从"被动响应"升级为"主动适配"其本质是实现从""(AI运行在云上)到""(为AI量身打造的云)的根本性转变。

专注:太空算力、AI infra、异构调度、大模型成本工程 627

3810: [Coci2015]Stanovi

3810: [Coci2015]Stanovi Time Limit: 15 Sec  Memory Limit: 64 MB Submit: 650  Solved: 302 [Submit][Status][Discuss] Description Input 输入一行,三个整数,n, m, k Output 输出一个数,表示最小不满意度。

CRZbulabula的博客 685

MeloTTS 生成 RKNN 模型

摘要: 本方案基于RK3588平台,利用RKNN工具链实现高效语音合成(TTS)。采用MeloTTS开源模型,支持中英文混合语音生成。部署流程包括:1) 导出ONNX模型;2) 转换为RKNN格式;3) 在RK3588开发板运行。关键步骤包含环境配置(RKNN Toolkit2≥1.4.0)、模型转换(非量化处理)及音频处理实现。方案充分发挥RK3588的NPU加速能力,适用于边缘设备语音合成场景

J。 346

微信小程序一键跳转公众号(使用 official-account 组件)

在当今移动互联网时代,用户体验已成为应用成功的关键因素之一。微信小程序作为一种便捷的应用形式,广泛应用于各个行业,为用户提供了丰富的服务和信息。然而,如何进一步提升用户体验,使其在小程序中能够更方便地获取相关信息,成为开发者需要关注的重要课题。实现一键跳转到公众号的功能,正是一个有效的解决方案。通过这一功能,用户可以轻松访问公众号,获取更多内容和服务,从而增强与品牌的互动和粘性。本文将详细介绍如何在微信小程序中实现这一功能,并提供相关的操作步骤和注意事项。

不迁怒,不贰过。小知识,大智慧。 3127

【HDU 3810】 Magina (01背包,优先队列优化,并查集)

Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of the Ancient).If you have no idea of him, here is some brief introduction of his legendary...

weixin_30849591的博客 289

S7-1500——(一)西门子PLC编程从入门到精通4、SCL间接寻址

学习目标是在掌握博途平台SCL编程语言的基本使用基础之上,进一步了解SCL语言环境下的间接寻址过程,初步具备编写复杂控制程序的能力;在编写plc程序过程中, 需要对plc中的数据进行访问,这就是寻址;直接寻址间接寻址;直接寻址直接寻址就是直接对数据的存储单元进行访问;根据表达方式的不同,可分为绝对寻址和符号寻址;对于plc中的标准数据存储区包括IQMTCL以及标准数据块,既可以使用绝对寻址,也可以使用符号寻址;绝对寻址在使用绝对寻址时,可以寻址的宽度包括位,字,节字,双字;

大小曲奇的博客 2121

hdu 3810 Magina 搜索+队列模拟分组背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3810 题意:有n个地方有怪,杀死怪消耗时间得到金钱。在某些怪处可以瞬移到另一些怪处(双向),不花费时间。求取得金钱M的最小时间。 首先,这是一张无向图,可以看成若干个连通分量。敌法可以一个连通分量内任意移动,因为不消耗时间。 然后这题就变成了一个分组背包的问题。每个组内是一个背包问题,对

弱菜zc 1168

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HDU 3810 Magina (推荐)搜索+队列模拟背包

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove   好题啊,前面好多是介绍dota里的这个英雄。。。可以忽略,到了最后一段才开始进入正题。 有n个地方有怪物,杀死每一个地方的怪物可以获得金钱gi,但是要花费ti的时间,英雄有个技能是瞬时移动,不需要花费时间,但是前提是两个地方

窝不是爱酱,喵~~~~ 1627

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Hdu 3810 Magina (DP_背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3810 题目大意:题目源自Dota,前面一堆介绍敌法师,最后一段才开始说有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。 解题思

2582

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HDU 3810 Magina

直接贴上ZeroClock的分析吧。。。 题目大意:题目源自Dota,前面一堆介绍敌法师,最后一段才开始说有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。 解题思路:2011年武汉邀请赛网络赛的金牌题,题目看上去很复杂,又是

iCpC之旅 1090

hdu 3810 Magina 队列优化的0-1背包t

题目大意: 给你n个怪,这些怪,有的在一组内,有的不在一组内,要杀只能杀一个组内的怪,m为升级需要的金钱要求,问最少花费多少可以升级; 解题思路: 根据怪的联通方式,我们可以通过深搜搜出一个组内的所有的怪; 因为本题的数据量很大,所以普通的背包无论是在空间上还是时间上都是无法承受的,所以需要借助队列模拟; 这里向网上的大牛致敬,慢慢学习! #include #include #incl

微不足道 521

hdu 3810

地址:http://acm.hdu.edu.cn/showproblem.php?pid=3810 题意:dota里面敌法师有一个技能blink,就是瞬间移动,而且没有CD。给定很多地方,有些距离比较近的地方是可以相互瞬间移动到的,问能否在达到给定金钱,并求出最小时间。 mark:本题把能够相互到达的可以看成一部分,那么就分成很多部分,每个部分没有任何联系,相互做一次01背包,取最小值就好的。...

weixin_30770495的博客 220

hdu 3810 Magina 5亿的背包,队列优化DP

Magina Time Limit: 60000/30000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 663    Accepted Submission(s): 212 Problem Description Magina, also known

便纵有千种风情 711

【POJ3810】Magina

Magina Time Limit: 60000/30000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 545    Accepted Submission(s): 178 Problem Description Magina, also known as A

ACM之路 761

HDU 3810 Magina 题解(搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=3810

madaidao的专栏 880

hdu 2771(uva 12171) Sculpture bfs+离散化

题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交,也可能相互嵌套,这些长方体形成了一个雕塑,求这个雕塑的总体积和表面积。 题解: 最容易想到直接进行bfs或者dfs统计,但此题的麻烦之处在于求整个雕塑的外表面积和雕塑内部可能出现四个长方体所搭成的空心,空心不能计算到表面积中,但是计算总体积却要计入,于是直接bfs或者dfs不好处理,于是,可以想到直接统计整个雕塑外围的所有小方块,即

myHelperIsMe的专栏 2313

2015-2016 ACM ICPC Baltic Selection Contest [解题报告]

新地址链接A题:AHB 水题,直接上代码:#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long Long; const int maxn = 1e5 + 10; const int maxm = 256;int main(

myHelperIsMe的专栏 1838
上一篇: uva 12726 One Friend at a Time bfs + 状态压缩
下一篇: Acdream 1424 Diversion 树链剖分+线段树
吃掉吃掉
博客等级 码龄12年 7粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值