题意:Ninian 的魔力可以在结界间传递。
结界中有 N 个光柱,第 i 个光柱的光压范围为 0~Ei 。魔力可以有 M 种传递,从光柱 Ai 传递到光柱 Bi ,花费时间 Ti 。
当魔力从光压为 S 传递并花费了 T 的时间后,就会衰减到光柱上光压为 S-T 处,S-T 不能为负。
Ninian 可以将魔力的光压花费 1 时间增加 1 或减少 1 ,当然魔力的光压不能超过光柱的光压范围,也不能小于 0 。
Ninian 的魔力初始在 1 号光柱,光压为 X 。
问 Ninian 的魔力到达第 N 个光柱且光压最大所需要的最少时间。

链接:点我

ans 因分为3个部分:1.中途增加光压的时间 2.中途减少光压的时间 3. 所有路程的总时间
发现没有增加光压的话,dist是递减的,如果把每个柱子的光压下限0去掉后,光压无论在何时加都是一样的
因为若从某刻光压小于等于0后,我们可以按需调整光压,不会出现降低光压这个操作,而不论如何最后的光压一定是h[n]
所以

1.光压无论在何时加都是一样的

而我们又发现在路径上减少1个光压和在光柱上人为调整1个光压的时间是一样的
光压差就是时间差
我们用dist[n]表示到点n时的光压

2.X-dist[终点]=中途减少光压的时间+所有路程的总时间

又由1得E[终点]-dist[终点]=中途增加光压的时间

这两个式子都是随着dist[终点]的递增而递减的
只要算出最大的dist[终点]即可,这就是为什么要用最短路

ans=(X-dist[终点])+(E[终点]-dist[终点)=X+E[终点]-2*dist[终点]

以上是某大牛的题解

ans=路上的消耗+总共需要充能多少

我自己的理解是dist表示从起始点中间也充能到某点的消耗

则x-dist[n]=路上的消耗

e[i]-dist[n]=总共需要充能多少

相加即为所求

 #include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN=;
const long long INF=0x3f3f3f3f;// >> 10^9*10^5
int H[MAXN];
long long dist[MAXN];
vector<int> to[MAXN],cost[MAXN];
struct Node{
long long d; //剩余能量
int v; //点编号
Node(long long dd,int vv)
{
d=dd;
v=vv;
}
friend bool operator<(Node a,Node b)
{
return a.d<b.d;
}
};
int main(){
/*#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif*/
int N,M,X,A,B,T;
scanf("%d%d%d",&N,&M,&X); for(int i=;i<=N;i++) scanf("%d",&H[i]);
for(int i=;i<M;i++)
{
scanf("%d%d%d",&A,&B,&T);
to[A].push_back(B);
cost[A].push_back(T);
to[B].push_back(A);
cost[B].push_back(T);
}
for(int i=;i<=N;i++) dist[i]=-INF;
priority_queue<Node> q;
q.push(Node(X,)); while(!q.empty())
{
Node now=q.top();
q.pop();
if(dist[now.v]!=-INF) continue;
dist[now.v]=now.d;
for(int i=;i<to[now.v].size();i++)
{
int u=to[now.v][i];
int c=cost[now.v][i];
if(c>H[now.v]) continue;
q.push(Node(min(now.d-c,(long long)H[u]),u)); //任意时刻都能充能量,能量不能溢出
}
}
if(dist[N]==-INF) puts("-1");
else printf("%lld\n",X+H[N]-dist[N]*); return ;
}

最新文章

  1. JAVA之直接内存(DirectMemory)
  2. js中文乱码怎么解决【转】
  3. Cocos2d 初学基本知识
  4. oracle 中v$sqlarea,v$sql,v$session,gv$session,远程连接等问题
  5. Unity手游之路&lt;六&gt;游戏摇杆之Easy Touch 3教程
  6. poj3764(dfs+Trie树+贪心)
  7. MySQL slave_exec_mode 参数说明
  8. cocos2d-x工作小记
  9. Git常用命令解说
  10. Android为TV端助力 使用shared注意事项
  11. 3. 基于优先级的Queue(PriorityBlockingQueue)
  12. Actor消息发送及等待结果关键字
  13. 运维ip语法,DNS配置方法
  14. Django视图层、虚拟环境
  15. Delphi TXLSReadWriteII2 带的demo中直接编辑XLS文件的例子
  16. TP引用样式表和js文件及验证码
  17. Objective-C的泛型
  18. Netty高性能编程备忘录(下)
  19. Python语言算法的时间复杂度和空间复杂度
  20. 20162327WJH第三次实验——查找与排序2

热门文章

  1. 64位linux安装32位校园网客户端
  2. mysql处理旧数据-使用模板以及临时表,不建议直接使用本表!!
  3. sicily 1231. The Embarrassed Cryptography
  4. ubuntu使用百度云盘插件
  5. 【前端开发】前端引入公共部分footer header的几种方法,及iframe自适应高度js
  6. javascript本地缓存方案-- 存储对象和设置过期时间
  7. ThinkPHP递归删除栏目
  8. Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)
  9. VMware虚拟机的三种联网方法及原理(转)
  10. 使用Kafka、Elasticsearch、Grafana搭建业务监控系统(三)Elasticsearch