★★   输入文件:eldrethalas.in   输出文件:eldrethalas.out   简单对比
时间限制:1 s   内存限制:256 MB

问题描述

一万两千年前,精灵还是在艾萨拉女王的统治下,辛德拉是女王手 下一名很有地位的法师。他受任建造了一座城市,来保存女王的法师们进行魔法研究的成果和法术物品。这个城市就是埃雷萨拉斯。永恒之井的爆炸,使这里的精灵 和总部联系中断,并失去了永恒之井的水做为能量的来源。辛德拉的后人为了满足魔法的欲望,捕猎了一个恶魔,伊莫塔尔,并以水晶塔建造了一个带有能量平衡系 统的结界监狱,水晶塔从恶魔身上吸取能量,一部分维持结界监狱,一部分可以让精灵狂热者吸收。近万年平安无事。但是现在,恶魔的能量被消耗得越来越多,最 终变得不稳定,已经难以维持结界监狱的消耗。统治这里的托尔塞林王子开始下令屠杀。只有少数狂热者之外的其他人都要死,以减少魔法能量的消耗。

终于,强大的戈多克食人魔入侵了埃雷萨拉斯,并杀死了大量的精灵。他们把这里当作他们的领地,叫做厄运之槌。面临灭顶之灾的精灵们把他们祖先留下的宝藏用魔法结界藏了起来,以防戈多克食人魔抢走。

作为一名勇敢的探险者,你悄悄来到了埃雷萨拉斯,来寻找传说中的宝藏。终于,你看到了宝藏,他就在你的前方不远处。但是你不能贸然前进,因为路上有着强大的魔法结界。这些结界根据能量的不同分为P种,踏入每种结界,你都会受到一定的伤害。为了拿到宝藏,这些伤害算不了什么。但是你要尽可能地减少伤害,请你设计一条路线,使你穿越结界获取宝藏受到的伤害最少。

下面是一个魔法结界能量示意图,结界是一个正方形,内部有P种不同的能量,每种字母表示一种能量。你从最上端开始走,每次能走到与你所在的位置邻接的一个单元格,或者在同种能量结界中任意传送。重复进入同一种能量结界不会再次受到伤害。

|AAABBC|

|ABCCCC|

|AABBDD|

|EEEEEF|

|EGGEFF|

|GGFFFF|

你有H点生命值,请你在贸然行动之前先判断是否能够活着(生命值大于0)穿越结界拿到宝藏,如果能够,请求出最大的生命值。

输入格式

第1行 三个非负整数 N P H。N为结界的边长,P为不同的能量结界的数量,H为你的生命值。

第2-P+1行 每行一个非负整数,表示走到该种能量结界受到的伤害值。

第P+2至第P+2+N行 每行N个正整数,为地图上该单元格的能量种类的编号,编号为1..P。

输出格式

如果你能够穿越结界到达对岸的宝藏,输出最多剩余的生命值。如果不能穿越,输出NO。

样例输入

6 7 10

3

1

2

2

1

1

3

1 1 1 2 2 3

1 2 3 3 3 3

1 1 2 2 4 4

5 5 5 5 5 6

5 7 7 5 6 6

7 7 6 6 6 6

样例输出

7

样例说明

路线为

起始-2-5-6-目标

1 1 1 2 2 3

1 2 3 3 3 3

1 1 2 2 4 4

5 5 5 5 5 6

5 7 7 5 6 6

7 7 6 6 6 6

数据规模

对于40%数据

4<=N<=10

对于100%数据

4<=N<=50

1<=P<=N*N

0<=H<=200000000

最短路

Rank1(窃喜)

平板电视快的飞起。。

屠龙宝刀点击就送

#include <iostream>
#include <cstdio>
#include <ext/pb_ds/priority_queue.hpp>
#define N 500000
#define pa pair<int,int>
using namespace std;
using namespace __gnu_pbds;
bool vis[N];
int n,p,h,cnt,fx[]={,-,,},fy[]={,,-,},mp[][],harm[],to[N<<],far[N],val[N<<],head[N<<],nextt[N<<];
typedef __gnu_pbds::priority_queue<pa,greater<pa>,pairing_heap_tag>heap;
heap::point_iterator id[N];
inline void ins(int u,int v,int w)
{
nextt[++cnt]=head[u];to[cnt]=v;val[cnt]=w;head[u]=cnt;
}
void dijkstra()
{
heap q;
for(int i=;i<=n*n+;++i) vis[i]=false,far[i]=0x3f3f3f3f;
far[]=;
id[]=q.push(make_pair(,));
for(int u;!q.empty();)
{
u=q.top().second;q.pop();
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i;i=nextt[i])
{
int v=to[i];
if(far[v]>far[u]+val[i])
{
far[v]=far[u]+val[i];
val[i]=;
if(id[v]!=) q.modify(id[v],make_pair(far[v],v));
else id[v]=q.push(make_pair(far[v],v));
}
}
}
}
int Main()
{
freopen("eldrethalas.in","r",stdin);
freopen("eldrethalas.out","w",stdout);
scanf("%d%d%d",&n,&p,&h);
for(int i=;i<=p;++i) scanf("%d",&harm[i]);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
scanf("%d",&mp[i][j]);
for(int a=;a<=n;++a)
for(int b=;b<=n;++b)
for(int c=;c<=n;++c)
for(int d=;d<=n;++d)
if(mp[a][b]==mp[c][d]&&a!=c&&b!=d) ins((a-)*n+b,(c-)*n+d,);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int k=;k<;++k)
{
int ti=i+fx[k],tj=j+fy[k];
if(ti<||ti>n||tj<||tj>n||mp[i][j]==mp[ti][tj]) continue;
ins((i-)*n+j,(ti-)*n+tj,harm[mp[ti][tj]]);
}
for(int i=;i<=n;++i) ins(,i,harm[mp[][i]]),ins(i,,harm[mp[][i]]);
for(int i=(n-)*n+;i<=n*n;++i) ins(i,n*n+,),ins(n*n+,i,);
dijkstra();
if(far[n*n+]!=0x3f3f3f3f&&h-far[n*n+]>) printf("%d\n",h-far[n*n+]);
else puts("NO");
return ;
}
int sb=Main();
int main(int argc,char *argv[]){;}

COGS 201. [BYVoid S1] 埃雷萨拉斯的宝藏的更多相关文章

  1. CCNP第二天 帧中继综合实验

    实验题如图所示: 要求全网可达 R5为帧中继交换机 R6 和 R1之间为快速以太网接口 所使用的拓扑为CCNA标准版拓扑图,如下所示: -------------------------------- ...

  2. 洛咕 P2468 [SDOI2010]粟粟的书架

    强行二合一啊... 前面直接二分最小值,二维前缀和.后面用主席树查最小值.注意要写\(nlogn\). // luogu-judger-enable-o2 #include<bits/stdc+ ...

  3. python27期day19:面向对象

    1.class GirlFriend(object): #定义女朋友类: eyes = 2 #类属性(静态属性),是属于当前类的 #当前类的所有对象,所共有的特征 sex = "女" ...

  4. JavaWeb-用过滤器修改请求的返回状态码

    问题: 客户SDK对接服务,默认只识别200和非200的请求状态码.需要修改当前应用的状态码(如将201转为200) 解决方案:通过扩展HttpServletResponseWrapper,获取到每个 ...

  5. 实验19:Frame-Relay

    实验16-1. 帧中继多点子接口 Ø    实验目的通过本实验,读者可以掌握如下技能:(1) 帧中继的基本配置(2) 帧中继的静态映射(3) 多点子接口的应用Ø     实验拓扑 实验步骤n  步骤1 ...

  6. cogs 920. [東方S1] 琪露诺

    二次联通门 : cogs 920. [東方S1] 琪露诺 /* cogs 920. [東方S1] 琪露诺 dp 方程为dp[i] = max (dp[i - L], dp[i - L + 1] ... ...

  7. 【最短路】埃雷萨拉斯寻宝(eldrethalas) 解题报告

    问题来源 BYVoid魔兽世界模拟赛 [问题描述] 一万两千年前,当精灵还是在艾萨拉女王的统治下的时候,辛德拉就是是女王手下一名很有地位的法师了.他受任建造了一座城市,来保存女王的法师们进行魔法研究的 ...

  8. Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd

    题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★   输入文件:butter.in   输出文件 ...

  9. NOIP2017 - 宝藏

    LibreOJ链接 Description 给出一个\(n(n\leq12)\)个点\(m(m\leq1000)\)条边的带权无向图,求该图的一棵生成树,使得其边权×该边距根的深度之和最小. Solu ...

随机推荐

  1. Flash builder发布Air程序时设备配置文件supportedProfiles的配置

    1. 发布的程序:需要访问本地进程,那么只能发布为exe程序才可以.   此时supportedProfiles 配置为 extendedDesktop desktop   desktop保证能发布a ...

  2. Socket通信常见问题

    1.检查服务器防火墙入站规则,是否允许对应端口通过.如果是云服务器,还需要通过对应账户去设置安全规则 2.服务端监听或绑定端口时,最好使用IPAddress.Any监听所有网口的改端口,创建socke ...

  3. 初识Composer

    关于vendor name和project name的区别? 包名(package name)包含了供应商名(vendor name)和项目名(project name)是为了避免命名冲突的 requ ...

  4. [Xcode 实际操作]四、常用控件-(10)动作表样式警告窗口的使用

    目录:[Swift]Xcode实际操作 本文将演示动作表单窗口的使用. 动作表单可以给用户展现一系列的选项, 和警告窗口不同的是,动作表单的展示形式和设备的尺寸有关. 在项目导航区,打开视图控制器的代 ...

  5. Objective-C对象的申请空间与初始化

    对象分配空间与初始化 对象分配空间与初始化 使用Objective-C语言创建一个对象有两个步骤,你必须: 为新对象动态分配内存空间 初始化新分配的内存,并赋初值 不经过如上两步,一个对象就没有完全功 ...

  6. [转]Xcode概览:调试应用程序

    原文网址: blog.csdn.net/fhbystudy/article/details/12856261 本文由CocoaChina翻译组成员Creolophus(github主页)翻译自苹果官方 ...

  7. Linux 调优方案, 修改最大连接数(ulimit命令)

    https://blog.csdn.net/isoleo/article/details/51732687 https://www.cnblogs.com/zengkefu/p/5649407.htm ...

  8. ELK系列(3) - Elasticsearch修改jvm参数

    方法 Elasticsearch默认会配置1G的JVM堆的初始值和最大值,该jvm参数被配置在/config/jvm.options里: -Xms1g -Xmx1g 如果只是个人开发小项目,可以把参数 ...

  9. 自动化测试 - Appium + Python史上最全最简环境搭建步骤

    一,为什么是Appium借一张图: 1.1 Appium优点 l  开源 l  跨架构:NativeApp.Hybird App.Web App l  跨设备:Android.iOS.Firefox ...

  10. JS——操作元素属性

    属性的操作包括:读和写 方法: 1)”.“操作 2)”[ ]“操作 eg: var oDiv = document.getElementById('div1'); var attr = 'color' ...