zoukankan      html  css  js  c++  java
  • 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。

     

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #define MAXN 110
     4 #define SIZE 100000
     5 #define INF 10005
     6 using namespace std;
     7 
     8 char B[1<<15],*S=B,*T=B;char getc(){
     9     return S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++;
    10 }
    11 #define isd(c) (c>='0'&&c<='9')
    12 int aa,bb;char ch;int Scan(){
    13     while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
    14     while(ch=getc(),isd(ch))aa=aa*10+ch-'0';return bb?aa:-aa;
    15 }
    16 
    17 struct EDGE {
    18     int To, Next, W;
    19 };
    20 
    21 int N;
    22 int A[MAXN][MAXN];
    23 EDGE E[SIZE];
    24 int Top, Last[MAXN];
    25 
    26 int Min(int A, int B) {
    27     return A < B ? A : B;
    28 }
    29 
    30 void Add(int A, int B, int C) {
    31     ++Top;
    32     E[Top].To = B;
    33     E[Top].Next = Last[A];
    34     E[Top].W = C;
    35     Last[A] = Top;
    36 }
    37 
    38 bool DFS(int HP, int X) {
    39     if (X == N) return 1;
    40     for (int i = Last[X]; i; i = E[i].Next) {
    41         if (HP * 2 + E[i].W > 0) {
    42             if (DFS(Min(HP * 2 + E[i].W, INF), E[i].To)) return 1;
    43         }
    44     }
    45     return 0;
    46 }
    47 
    48 int main() {
    49     N = Scan();
    50     for (int i = 1; i <= N; ++i) {
    51         for (int j = 1; j <= N; ++j) {
    52             A[i][j] = Scan();
    53             if (A[i][j] != 0) Add(i, j, A[i][j]);
    54         }
    55     }
    56     int L = 1, R = INF;
    57     while (L <= R) {
    58         int Mid = (L + R) >> 1;
    59         if (DFS(Mid, 1)) R = Mid - 1;
    60         else L = Mid + 1;
    61     }
    62     printf("%d
    ", L);
    63 }

         

  • 相关阅读:
    JPA、Hibernate、Spring data jpa之间的关系
    MySQL8.0的安装、配置、启动服务和登录及配置环境变量
    jdbc和odbc
    Win10下 Java环境变量配置
    SpringMVC框架理解
    看看资深程序员是如何教你破解图形验证码!这不很简单嘛!
    破解极验(geetest)滑动验证码
    java做图片点击文字验证码
    java实现点击图片文字验证码
    什么是HttpOnly
  • 原文地址:https://www.cnblogs.com/DonMaestro/p/4322276.html
Copyright © 2011-2022 走看看