3875: [Ahoi2014]骑士游戏

Time Limit: 30 Sec  Memory Limit: 256 MB

Description

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

Input

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

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<=N<=2*10^5,1<=Ri,Sigma(Ri)<=10^6,1<=Ki,Si<=5*10^14
  这真的是一道很妙的题,反正我是没做出来的。
  困扰在"一个怪被砍死会长出一堆不同的怪"这个问题上,难道怪物基因都是相同的怎么跑最短路啊。
  去网上看了一波题解发现都讲的很少,似乎是因为这题太水?智障选手请过早弃疗。
  假设没有环出现,对它是一个DAG,就是一个很水的DP题了,反向拓扑一下。
  然后现在有环了。有环就会有什么呢?有后效性。DP是不能解决有后效性的问题的。
  但是SPFA可以。SPFA就是完全没有管后效性的算法(所以很容易被卡?)。
  设把怪净化掉的最小花费是f。那么就有: f[i]=min(K[i],S[i]+Σf[R]);
  所以一个家伙被更新可能会造成前驱的更新。
  所以把它的前驱扔进队列直到队列为空输出f[1]是什么算法啊啊啊啊!
  咳咳。所以具体实现步骤就是这样:
  把所有的点的f赋为K[i]并加入队列。
  计算队首的f'。如果比当前优秀,就更新并加入所有前驱。
  直到队列空。
  其实我很害怕这个东西的复杂度,但是就是过了... ...

#include    <iostream>
#include    <cstdio>
#include    <cstdlib>
#include    <algorithm>
#include    <vector>
#include    <cstring>
#include    <queue>
#include    <complex>
#include    <stack>
#define LL long long int
#define dob double
using namespace std;const int N = 200010;
const int M = 1000010;
struct Node{int to,next;}E[M];
int head[N],tot,n,In[N],R[N];
LL S[N],f[N],K[N];
vector<int>G[N];int gi()
{int x=0,res=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')res*=-1;ch=getchar();}while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*res;
}LL gL()
{LL x=0,res=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')res*=-1;ch=getchar();}while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*res;
}inline void link(int u,int v){E[++tot]=(Node){v,head[u]};head[u]=tot;
}inline void SPFA()
{queue<int>Q;for(int i=1;i<=n;++i)Q.push(In[i]=i);while(!Q.empty()){int x=Q.front();Q.pop();In[x]=0;LL sum=S[x];for(int i=0;i<R[x];++i)sum+=f[G[x][i]];if(sum>=f[x])continue;f[x]=sum;for(int e=head[x];e;e=E[e].next)if(!In[E[e].to])Q.push(E[e].to),In[E[e].to]=1;}
}int main()
{n=gi();for(int i=1;i<=n;++i){S[i]=gL();K[i]=gL();R[i]=gi();for(int j=1;j<=R[i];++j){int r=gi();link(r,i);G[i].push_back(r);}f[i]=K[i];}SPFA();printf("%lld\n",f[1]);return 0;
}

  

转载于:https://www.cnblogs.com/fenghaoran/p/7208571.html

BZOJ 3875 Ahoi2014 骑士游戏相关推荐

  1. BZOJ 3875 Ahoi2014 骑士游戏 SPFA

    题目大意:给定n个怪物,每个怪物可以用魔法直接干掉,或者用物理攻击使其分裂为一些其他怪物,求杀掉1号怪物的最小花销 令f[i]为杀死i号怪物的最小花销,则f[i]=min(k[i],s[i]+Σf[j ...

  2. 3875: [Ahoi2014]骑士游戏

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 599  Solved: 319 [Submit][Stat ...

  3. BZOJ 3875: [Ahoi2014Jsoi2014]骑士游戏 dp spfa

    3875: [Ahoi2014&Jsoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 933  Solved: 475 ...

  4. bzoj 3875: [Ahoi2014Jsoi2014]骑士游戏【dp+spfa】

    设f[i]为杀死i的最小代价,显然\( f[i]=min(k[i],s[i]+\sum f[to]) \) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的 ...

  5. BZOJ3875: [Ahoi2014]骑士游戏

    Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...

  6. [AHOI2014]骑士游戏

    [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JYY一共有两种攻击方式,一 ...

  7. Bzoj3875 [Ahoi2014]骑士游戏

    Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 749  Solved: 392 Description [故事背景] 长期的宅男生活中,JYY又挖掘 ...

  8. 【BZOJ3875】【Ahoi2014】骑士游戏 SPFA处理有后效性动规

    Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...

  9. 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏

    洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...

最新文章

  1. 排序算法汇总——转载自http://blog.csdn.net/zhanglong_daniel/article/details/52513058
  2. Spring源码剖析——Bean的配置与启动
  3. Qt5.15.2+VS2019安装小结
  4. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 1
  5. 上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看
  6. 【Tool】sublime txt的使用
  7. python剑指offer替换空格_迷人的算法-剑指offer面试题5:替换空格
  8. php环境苹果搭建,mac下搭建php环境
  9. Flex4之元数据标签使用
  10. html之meta标签
  11. Android手机会中电脑病毒么,安卓手机中木马病毒怎么办
  12. win10计算机怎么计算根号,详细介绍win10系统自带的计算器的功能,经验告诉你该这样...
  13. Win32_Processor CPU 参数说明
  14. DWC的1000M的MAC自环和PHY自环测试寄存器修改方式
  15. HTML5 PDF 编辑,pdf.js的使用与改造
  16. 了解 TCP 系统调用序列
  17. .ignore插件自动忽略
  18. 全球与中国医疗BI软件市场深度研究分析报告
  19. python扫雷总结与体会_扫雷拓展训练心得体会
  20. 西部矿业(601168):整合湖北铅锌资源

热门文章

  1. TCP长连接,心跳机制介绍
  2. 天龙八部手游服务器维护公告,【已完成】安卓版本更新维护公告
  3. 厉害了,我的国百度云资源
  4. 使用Three.js实现炫酷的赛博朋克风格3D数字地球大屏
  5. 数据分析(1)——统计学中的各种分布
  6. 腾讯云轻量级服务器怎么搭建网站,腾讯云轻量应用服务器新手教程:快速搭建网站...
  7. occt 几何图形库入门01
  8. 儿童bml计算机在线,中国儿童超重、肥胖体重指数BMI分类标准(kg/m2)
  9. Android商城开发(一)——一次活动页需求引发的危机感
  10. MySQL数据库管理(五)日志管理、备份与恢复