【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏

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

题解:设f[i]表示杀死一个怪兽的最小花费,显然$f[i]=max(K[i],S[i]+\sum f[j])$。这个DP状态显然是存在环的,我们考虑用SPFA来优化DP。

先建反向图,然后令一开始所有f的初始值都是K,将所有点压入队列,然后边SPFA边DP。我们用g[i]表示上一次从队列中取出i的时候,f[i]的值。那么我们用当前的i去更新它能更新的所有f值,令D=f[i]-g[i],即当前点f的变化量,那么它能更新到的所有点的f值都要-=D。如果一个点在更新后f值大于g值,则将其压入队列。

说这么多其实跟正常的SPFA没什么区别,搞一搞就行。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=200010;
typedef long long ll;
int n,m,cnt;
int inq[maxn],head[maxn],to[1000010],next[1000010],p[maxn];
ll f[maxn],ff[maxn],g[maxn],v1[maxn],v2[maxn];
queue<int> q;
inline ll rd()
{ll ret=0,f=1;    char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')    f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
inline void add(int a,int b)
{to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{n=rd();int i,j,a,b,u;memset(head,-1,sizeof(head));for(i=1;i<=n;i++){q.push(i),inq[i]=1;g[i]=v1[i]=rd(),ff[i]=v2[i]=rd(),a=rd();while(a--)    b=rd(),add(b,i);}for(i=1;i<=n;i++)  for(j=head[i];j!=-1;j=next[j])   g[to[j]]+=v2[i];for(i=1;i<=n;i++)  f[i]=min(g[i],v2[i]);while(!q.empty()){u=q.front(),q.pop(),inq[u]=0;if(ff[u]==f[u])    continue;for(i=head[u];i!=-1;i=next[i])//    if(min(g[to[i]]+f[u]-ff[u],v2[to[i]])<f[to[i]]){g[to[i]]+=f[u]-ff[u],f[to[i]]=min(g[to[i]],v2[to[i]]);if(f[to[i]]<ff[to[i]]&&!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);}ff[u]=f[u];}printf("%lld\n",f[1]);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7670066.html

【BZOJ3875】[Ahoi2014Jsoi2014]骑士游戏 SPFA优化DP相关推荐

  1. bzoj3875: [Ahoi2014Jsoi2014]骑士游戏 spfa处理有后效性动规

    bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的 ...

  2. bzoj3875: [Ahoi2014Jsoi2014]骑士游戏(spfa+dp)

    传送门 题意简述: n n n个怪物,对于编号为 i i i的怪物可以选择用 a i a_i ai​代价将其分裂成另外的 b i b_i bi​个怪物或者用 c i c_i ci​代价直接消灭它,现在 ...

  3. bzoj3875 [Ahoi2014Jsoi2014]骑士游戏

    Description 长期的宅男生活中, JYYJYY 又挖掘出了一款 RPGRPG 游戏.在这个游戏中 JYYJYY 会扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. 在这个游戏中, J ...

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

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

  5. bzoj3875 【Ahoi2014】骑士游戏 spfa处理后效性动规

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

  6. BZOJ3875: [Ahoi2014]骑士游戏

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

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

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

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

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

  9. [Ahoi2014Jsoi2014]骑士游戏(SPFA)

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

最新文章

  1. 日常工作,怎么结合工具设计有效的时间管理?
  2. 获取周/月的第一天最后一天
  3. nodejs全局安装和本地安装的区别
  4. 机器学习(三十二)——t-SNE, Adaboost
  5. [渝粤教育] 中国地质大学 大学英语(1) 复习题
  6. java 对象复制字段_利用Java反射机制实现对象相同字段的复制
  7. php钩子是啥意思,thinkphp钩子是什么意思
  8. c 语言随机验证码原理,用C生成随机中文汉字验证码的基本原理及代码.doc
  9. 二叉树+链表+字符串+栈和队列高频面试题合集
  10. 【渝粤教育】国家开放大学2018年春季 0248-21T电工电子技术 参考试题
  11. 谨以此文献给才毕业2--5年的朋友(转)
  12. 3.4 小乌龟git使用说明
  13. Creator开源游戏、插件、教程、视频汇总
  14. axure8 Mac破解版+汉化包
  15. 微信H5 跳转小程序 (html版本)
  16. proteus 的使用
  17. python识别图片上的文字_Python程序图片和pdf上文字识别实例
  18. FLASH入门常见问题
  19. sumo交通流仿真软件的使用说明
  20. thinningopencv

热门文章

  1. 阿龙的学习笔记---《程序员自我修养-链接、装载与库》读书笔记(三)
  2. python爬取淘宝销量_python爬取淘宝排名
  3. FBI网站被黑致数据泄露?官方称这根本是个骗局
  4. 【图像语义分割】Large Kernel Maters--Improved Semantic Segmentation by Global ConvNet
  5. Scrum框架详解总结
  6. 【好奇心驱动力】ESP32-CAM人体感应拍照并推送到微信
  7. office2018自动图文集_学会使用Word自动图文集,让你事半功倍
  8. 5g信号频率是多少赫兹_解读5G标准:① 5G频率范围与频段
  9. 企业IT管理员IE11升级指南【8】—— Win7 IE8和Win7 IE11对比
  10. 三星正在研发智能戒指,智能戒指当然少不了Find My功能