恶魔城
2015-07-30 13:39
405 查看
3: 恶魔城(Satanic Castle)
(satanic.pas/cpp/c 1s)
问题描述:
上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,为了节省自己的内力,所以上帝不希望让他的INITHP过高。
任务:
给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
输入格式:
从文件satanic.in读入数据,文件第一行有一个正整数N(3 ≤ N≤ 100),下面跟的第i行第j个数为A[i,j](绝对值不超过10000的整数)。
输出格式:
输出所求最小的INITHP到文件satantic.out中。
样例
二分,然后我们可以dfs到终点来判断,刚开始以为要dp,然后毫无办法,然后下来一想,二分啊啊啊啊啊!!!于是乎代码就很好想了。。。。
【代码】:
View Code
(satanic.pas/cpp/c 1s)
问题描述:
上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,为了节省自己的内力,所以上帝不希望让他的INITHP过高。
任务:
给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
输入格式:
从文件satanic.in读入数据,文件第一行有一个正整数N(3 ≤ N≤ 100),下面跟的第i行第j个数为A[i,j](绝对值不超过10000的整数)。
输出格式:
输出所求最小的INITHP到文件satantic.out中。
样例
satanic.in | satanic.out |
4 0 -4 0 -10 0 0 +3 0 0 0 0 -14 0 0 0 0 | 4 |
【代码】:
#include<iostream> #include<cstdio> using namespace std; int n; int map[600 + 5][600 + 5]; bool dfs(int x,int hp) { bool flag = true; if(hp <= 0)return false; if(x == n)return true; for(int i = 1; i <= n; i++) { if(map[x][i]) { flag = dfs(i,hp * 2 + map[x][i]); if(flag == true)return true; } } return flag; } int main() { freopen("satanic.in", "r", stdin); freopen("satanic.out", "w", stdout); scanf("%d", &n); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) scanf("%d", &map[i][j]); } int r = 1000000; int l = 1; while(l < r)//二分 { int m = (l + r) >> 1; if(dfs(1,m))r = m; else l = m + 1; } printf("%d",l); return 0; }
View Code
相关文章推荐
- [转载]linux下查找字符串的命令
- 我的Emacs配置文件
- 仿站违法和侵权吗?
- js 函数对象
- 提升效率 Windows 10 快捷键汇总
- SQL基础总结——20150730
- 从.net复制源代码中国农历阵列,必要做日历
- Java UrlRewrite 实现网站URL重写过程实录
- web服务器分层架构的资源文件映射安全以及在J2EE应用中的利用与危害
- win10评测
- Web应用的组件化开发
- 国内互联网企业奇妙招数
- 语音信号的时域维纳滤波器原理简介
- 【kmp】hdu1171 Number Sequence
- 大话测试数据(一)
- win2008R2 FTP 相关 200 227 550
- HTTP 和 HTTPS 协议
- MYSQL的UNIQUE索引包含null值及验证
- 【kmp】POJ-3461 Oulipo
- 如何理解java回电话