bzoj3875 [Ahoi2014&Jsoi2014]骑士游戏

探讨一款RPG游戏中的怪兽挑战问题,玩家需利用普通攻击和法术攻击消灭不同种类的怪兽,通过SPFA算法求解最小体力消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

长期的宅男生活中, \(JYY\) 又挖掘出了一款 \(RPG\) 游戏。在这个游戏中 \(JYY\) 会扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。
在这个游戏中, \(JYY\) 一共有两种攻击方式,一种是普通攻击,一种是fa术攻击。两种攻击方式都会消耗 \(JYY\) 一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽;而采用法术攻击则可以彻底将一个怪兽杀死。当然了,一般来说,相比普通攻击,法术攻击会消耗更多的体力值(但由于游戏系统 \(bug\),并不保证这一点)。
游戏世界中一共有 \(N\) 种不同的怪兽,分别由 \(1\)\(N\) 编号,现在 \(1\) 号怪兽入侵村庄了, \(JYY\) 想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢?

Input

第一行包含一个整数 \(N\)
接下来 \(N\) 行,每行描述一个怪兽的信息;
其中第 \(i\) 行包含若干个整数,前三个整数为 \(S_i,K_i,R_i\) ,表示对于 \(i\) 号怪兽,普通攻击需要消耗 \(S_i\) 的体力,法术攻击需要消耗 \(K_i\) 的体力,同时 \(i\) 号怪兽死亡后会产生 \(R_i\) 个新的怪兽。表示一个新出现的怪兽编号。同一编号的怪兽可以出现多个。

Output

输出一行一个整数,表示最少需要的体力值。

Sample Input

4
4 27 3 2 3 2
3 5 1 2
1 13 2 4 2
5 6 1 2

Sample Output

26

HINT

首先用消耗 \(4\) 点体力用普通攻击,然后出现的怪兽编号是 \(2\)\(2\)\(3\) 。花费 \(10\) 点体力用法术攻击杀死两个编号为 \(2\) 的怪兽。剩下 \(3\) 号怪兽花费 \(1\) 点体力进行普通攻击。此时村庄里的怪兽编号是 \(2\)\(4\) 。最后花费 \(11\) 点体力用法术攻击将这两只怪兽彻底杀死。一共花费的体力是 \(4+5+5+1+5+6=26\)

\(2\le N\le 2\times 10^5,1<=R_i,\sum {R_i} \le 10^6,1\le K_i,S_i\le 5\times 10^{14}\)

Solution

\(spfa\) 来进行 \(dp\) 。其中

  • \(d[i]\) 表示清除 \(i\) 以及后面的所有怪兽的最小费用。
  • \(d[1]\) 为答案。

直接 \(dp\) 的话有后效性,所以用 \(spfa\)\(dp\) ,建一个反图来更新前驱。

#include<bits/stdc++.h>
using namespace std;

#define N 200001
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define fech(i, x) for (int i = 0; i < x.size(); i++)
#define ll long long

inline ll read() {
    ll x = 0, flag = 1; char ch = getchar(); while (!isdigit(ch)) { if (!(ch ^ '-')) flag = -1; ch = getchar(); }
    while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); return x * flag;
}

int n;
ll s[N], d[N];
vector<int> g[N], r[N];

queue<int> q; bool inq[N];
void spfa() {
    rep(i, 1, n) q.push(i), inq[i] = 1;
    while(!q.empty()) {
        int u = q.front(); ll t = s[u]; q.pop(), inq[u] = 0;
        fech(i, g[u]) t += d[g[u][i]];
        if(t < d[u]) { d[u] = t; int v; fech(i, r[u]) if(!inq[(v = r[u][i])]) q.push(v), inq[v] = 1; }
    }
    cout << d[1];
}

int main() {
    n = read();
    rep(i, 1, n) {
        s[i] = read(), d[i] = read(); int T = read();
        while(T--) { int t = read(); g[i].push_back(t), r[t].push_back(i); }
    }
    spfa(); return 0;
}

转载于:https://www.cnblogs.com/aziint/p/8416376.html

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值