FZYZOJ-1144 恶魔城

P1144 -- 恶魔城

时间限制:1000MS      内存限制:131072KB

状态:Accepted      标签:    图论-最短路   二分   无

Description

上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有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,使这个战士能够活着见到撒旦。

Input Format

第一行有一个正整数N(3 N 100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数

Output Format

输出所求最小的INITHP。

Sample Input

4
0 -4 0 -10
0 0 +3 0
0 0 0 -14
0 0 0 0

Sample Output

4

Hint

HP都为整数。

题解

因为要求HP的最小值,那么首先想到二分答案。由题目得A[i][j]的绝对值不大于10000,那么二分区间就是[1,10000]。由于最多只会有一百个点,所以可以用深搜来判定。注意由于HP不断乘二,所以到最后的数值会很大,如何解决呢?不难发现,因为A[i][j]的绝对值不大于10000,只要HP大于等于10000,那么必然可以到达终点,所以可以设10000为INF,一旦HP超过INF,就设成INF。

代码

#include <cstdio>
#include <iostream>
#define MAXN 110
#define SIZE 100000
#define INF 10005
using namespace std;

char B[1<<15],*S=B,*T=B;char getc(){
	return S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++;
}
#define isd(c) (c>=‘0‘&&c<=‘9‘)
int aa,bb;char ch;int Scan(){
	while(ch=getc(),!isd(ch)&&ch!=‘-‘);ch==‘-‘?aa=bb=0:(aa=ch-‘0‘,bb=1);
	while(ch=getc(),isd(ch))aa=aa*10+ch-‘0‘;return bb?aa:-aa;
}

struct EDGE {
	int To, Next, W;
};

int N;
int A[MAXN][MAXN];
EDGE E[SIZE];
int Top, Last[MAXN];

int Min(int A, int B) {
	return A < B ? A : B;
}

void Add(int A, int B, int C) {
	++Top;
	E[Top].To = B;
	E[Top].Next = Last[A];
	E[Top].W = C;
	Last[A] = Top;
}

bool DFS(int HP, int X) {
	if (X == N) return 1;
	for (int i = Last[X]; i; i = E[i].Next) {
		if (HP * 2 + E[i].W > 0) {
			if (DFS(Min(HP * 2 + E[i].W, INF), E[i].To)) return 1;
		}
	}
	return 0;
}

int main() {
	N = Scan();
	for (int i = 1; i <= N; ++i) {
		for (int j = 1; j <= N; ++j) {
			A[i][j] = Scan();
			if (A[i][j] != 0) Add(i, j, A[i][j]);
		}
	}
	int L = 1, R = INF;
	while (L <= R) {
		int Mid = (L + R) >> 1;
		if (DFS(Mid, 1)) R = Mid - 1;
		else L = Mid + 1;
	}
	printf("%d\n", L);
}
时间: 2024-08-08 22:05:32

FZYZOJ-1144 恶魔城的相关文章

银行爱“IOE”爱得有多深

本文由阿尔法工场欧阳长征推荐 导读:如果银行是一家海鲜酒楼,把IBM换掉相当于大搞一次装修,把Oracle换掉相当于把厨子和菜谱全部换掉,把EMC换掉相当于把放食材工具的储物间换个地方.难度在于,这海鲜酒楼白天黑夜都还要照常营业 问题一:搞IBM的原因: 1.最近中国和俄罗斯在互做小甜甜,当然看到美国就叫牛夫人了. 2.国家级的管理机构刚成立. 最近上头一连串的招数:禁Windows8+禁止美资咨询+弃用IBM服务器都是这两个点的结合点. 问题二:为啥是IBM? 1.擒贼先擒王,IBM出名,是美

强哥告诉你 - 传统IT人,你为什么需要一个云计算的证书

10年前,强哥没有想到一个无意的选择能够给自己的职业生涯甚至生活带来如此深远的影响. 一 2005年,当强哥还在华南一家集成商工作时,那时候公司的大佬都是Unix专家,对x86不屑一提. 记得当时负责x86这一块的就一位工程师.他不但要负责x86服务器的安装,配置,还要负责相关操作系统的安装 - 除了Windows,Linux都得懂以外,还得懂SQL Server数据库,Windows MSCS集群,杀毒软件等等一系列的相关软件.而反观Unix方面,IBM AIX,HP-UX,Oracle还有存

题目1144:Freckles(最小生成树进阶)

题目链接:http://ac.jobdu.com/problem.php?pid=1144 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1144 Freckles.cpp // Jobdu // // Created by PengFei_Zheng on 18/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <s

QT多重继承的时候,要把QObject放在最前面,否则报错——C++认为人性本恶,默认都是私有的,这点和Delphi的世界观不一样

在买来的控件(没有源码)的基础上,想加入QObject的一些特性,不得不多继承: class MyProgress : public CProgress, public QObject 但总是报错: release\moc_my_tool.cpp:80:12: error: 'qt_metacast' is not a member of 'CProgress' return CProgress::qt_metacast(_clname); 清除临时文件,重新编译几次后,仍是如此,心想难道QT不

恶补Java(十三)之Java IO-----File类的用法

恶补Java---JavaI/O部分之File类的用法(笔记) 在java中,I/O(输入/输出)是比较乏味的事情,因为看不到明显的运行效果,但输入/输出是所有程序都必需的部分--使用输入机制,允许程序读取外部数据(包括来自磁盘.光盘等存储设备的数据).用户输入数据:使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘.光盘等存储设备中. Java的I/O通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流,每种输入.输出流又可分为字节流和字符流两大类.其

健康日志之恶黑---恶黑相关用药

http://bbs.tianya.cn/post-funinfo-5659193-1.shtml http://www.adicon.com.cn/yxjy/jbzd/clb/66-jbzd/zljb/1079-braf.html pd1,肿瘤当中的抗生素之王 阿帕替尼 小分子靶向药,胃癌晚期 印度格列卫  http://baike.baidu.com/link?url=rbubwUUtIFLSlG75PsWq8XQBsYQn2bNheyBpqakesxqNniywFUVSYh4t8_diO7

恶补java(十)---泛型与集合的再学习

其余的就不多说了,一切都在代码中 package com.gc.generic; /** * JDK5 之前集合对象使用问题: * 1.向集合添加任何类型对象 * 2.从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换 * 存在安全隐患 * * ***************************** * * JDK5中的泛型:允许程序员使用泛型技术限制集合的处理类型 * List<String> list=new ArrayList<String>(); * 从而

唐太宗用人 不以一恶忘其善(使用每个人的特点去做事情)

唐太宗李世民知人善任,成就了大唐辉煌盛世.(网络图片) 古代圣贤们给我们留下了很多的智慧结晶与用人之道,在讲到大到治国安天下的同时也将做人的道理陈述了出来.唐太宗李世民的著作<帝范>中有很多值得学习的东西.简举一两例. 智用人才 <帝范>卷二,审官第四:“夫设官分职,所以阐化宣风.故明主之任人,如巧匠之制木,直者以为辕,曲者以为轮:长者以为栋梁,短者以为栱角.无曲直长短,各有所施.明主之任人,亦由是也.智者取其谋,愚者取其力:勇者取其威,怯者取其慎,无智.愚.勇.怯,兼而用之.故良

洛谷 1144 最短路计数 bfs

洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 100000 + 500;