3875: [Ahoi2014]骑士游戏
3875: [Ahoi2014]骑士游戏
Time Limit: 30 Sec Memory Limit: 256 MB
Submit: 599 Solved: 319
[Submit][Status][Discuss]
Description
Input
Output
输出一行一个整数,表示最少需要的体力值。
Sample Input
4 27 3 2 3 2
3 5 1 2
1 13 2 4 2
5 6 1 2
Sample Output
HINT
Source
By 佚名上传
[Submit][Status][Discuss]
可以很容易想到一种dp的做法,令fi:杀死第i中怪物的最小消耗 那么fi = min(∑fk + si,ki) ∑fk就是把所有分裂出来的怪物都杀死的最小代价 貌似一个记搜就能搞定?? 但是很明显,这个dp会出现死循环的情况,, 原因是用普通攻击杀死怪物的时候,再次普通攻击,循环下去可能会出现之前杀过的怪物 说明说这个杀死怪物出现的环一定要在某处断开 考虑某个时刻,有些怪物,手动杀死他后出现的所有新怪物的fj都被算出来了, 那么当前这个fi也就出来了,当fi出来后,我们就能像DAG上dp那样把这只怪物扔进队列去弄 但是DAG上的dp是基于拓扑序的 如果某一时刻,剩余所有怪物的出度都不为0,这个dp就无法下去 但是这种情况下,对于那只用魔法杀死代价最小的怪物,它的fi也被确定了 就是直接用魔法杀死他的代价 因为此时如果再用普通攻击,新衍生的怪物总得被魔法杀死,但是这只怪物已经是消耗最小的了,不可能再少 因此,不断选出当前魔法攻击消耗最小的怪物,不断跑BFS,这题就解决了
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<bitset>
#include<algorithm>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<cmath>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;const int maxn = 2E5 + 20;
typedef long long LL;
const LL INF = 1E17;struct data{int num; LL c; data(){}data(int num,LL c): num(num),c(c){}bool operator < (const data &b) const {return c > b.c;}
};struct E{int to,w; E(){}E(int to,int w): to(to),w(w){}
};int n,m,cnt,pass,du[maxn],vis[maxn],g[maxn],a[maxn*10];
LL f[maxn],tot[maxn],S[maxn];
bool bo[maxn];vector <E> v[maxn];
priority_queue <data> Q;
queue <int> q;void Add()
{if (pass == n) return;for (;;) {data k = Q.top(); Q.pop();if (bo[k.num]) continue;bo[k.num] = 1; ++pass;q.push(k.num); return;}
}void BFS()
{while (!q.empty()) {int k = q.front(); q.pop();for (int i = 0; i < v[k].size(); i++) {E e = v[k][i]; --du[e.to];if (bo[e.to]) continue;tot[e.to] += 1LL*e.w*f[k];tot[e.to] = min(tot[e.to],INF);if (!du[e.to]) {f[e.to] = min(f[e.to],tot[e.to] + S[e.to]);++pass; bo[e.to] = 1; q.push(e.to); }}}
}LL getLL()
{char ch = getchar();LL ret = 0;while (ch < '0' || '9' < ch) ch = getchar();while ('0' <= ch && ch <= '9')ret = ret*10LL + 1LL*(ch - '0'),ch = getchar();return ret;
}int main()
{#ifdef DMCfreopen("DMC.txt","r",stdin);#endifn = getLL();for (int i = 1; i <= n; i++) {S[i] = getLL(); f[i] = getLL();Q.push(data(i,f[i]));m = getLL(); ++cnt;for (int j = 1; j <= m; j++) {a[j] = getLL();if (vis[a[j]] != cnt) g[a[j]] = 0;++g[a[j]]; vis[a[j]] = cnt;}++cnt;for (int j = 1; j <= m; j++)if (vis[a[j]] != cnt) {v[a[j]].push_back(E(i,g[a[j]]));vis[a[j]] = cnt; ++du[i];}}for (int i = 1; i <= n; i++)if (!du[i]) ++pass,q.push(i),bo[i] = 1;for (; pass < n; Add()) BFS();cout << f[1];return 0;
}
3875: [Ahoi2014]骑士游戏相关推荐
- BZOJ 3875 Ahoi2014 骑士游戏
3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款 ...
- BZOJ 3875 Ahoi2014 骑士游戏 SPFA
题目大意:给定n个怪物,每个怪物可以用魔法直接干掉,或者用物理攻击使其分裂为一些其他怪物,求杀掉1号怪物的最小花销 令f[i]为杀死i号怪物的最小花销,则f[i]=min(k[i],s[i]+Σf[j ...
- BZOJ 3875: [Ahoi2014Jsoi2014]骑士游戏 dp spfa
3875: [Ahoi2014&Jsoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 933 Solved: 475 ...
- BZOJ3875: [Ahoi2014]骑士游戏
Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...
- [AHOI2014]骑士游戏
[故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JYY一共有两种攻击方式,一 ...
- Bzoj3875 [Ahoi2014]骑士游戏
Time Limit: 30 Sec Memory Limit: 256 MB Submit: 749 Solved: 392 Description [故事背景] 长期的宅男生活中,JYY又挖掘 ...
- bzoj 3875: [Ahoi2014Jsoi2014]骑士游戏【dp+spfa】
设f[i]为杀死i的最小代价,显然\( f[i]=min(k[i],s[i]+\sum f[to]) \) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的 ...
- 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏
洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...
- [AHOI2014/JSOI2014]骑士游戏 深入理解spfa
[AHOI2014/JSOI2014]骑士游戏 杀死魔物有两种方式 魔法或者物理攻击再让它去世 则 dis = min(魔法 , 物理+所有子代魔法); 就像dp,然而可能成环.考虑spfa成环距离必 ...
最新文章
- 第9部分 备份与灾难恢复
- javascript获取和设置URL中的参数
- 3天html自学教程,html自学教程(八)html5基础
- cygwin下的gcc-4.7.1编译心得
- bash 不是内部或外部命令_Win10_cmd下提示:‘xxx’不是内部或外部命令,也不是可运行的程序 或批处理文件...
- php语句过滤掉html标签_php过滤html标签
- 云漫圈 | 我觉得我的手机被监听了。。。
- Oracle之自治事务
- mysql 执行存储过程_MySQL存储过程的3种循环
- Openwrt之移动硬盘ext3/ext4格式化工具
- linux 设置java内存大小_Linux 下修改Tomcat使用的JVM内存大小
- 设计模式笔记六:适配器模式
- 1012.log4cplus项目应用
- Redmi K50系列三款新机全部入网:三款旗舰芯片都很能打
- 三菱plc编程软件gx+developer安装教程
- 卷积神经网络结构图绘制,卷积神经网络图怎么画
- java抽象和接口的理解_Java学习笔记16---抽象类与接口的浅显理解
- “智多星”智能手机销售网
- win10邮件同步出错
- PS调色精灵ps插件
热门文章
- SitePoint Podcast#30:Google感染IE
- 微信公众号微信搜索好物和服务器,你一定不知道还可以用这样的方法阅读微信公众号内容...
- 2021-05-1java基础
- java绘图技术,演示绘制不同的图形
- (17)-- 网页的foot制作
- iPhone/IOS使用Fiddler抓包配置
- 关于Android高德地图路线规划的学习
- 浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)
- 职场:大学生情侣搭档求职难
- 最近腾讯手机管家a.gray.Bulimia.a病毒提示决解方案