7.26T3小游戏

Posted gaojunonly1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.26T3小游戏相关的知识,希望对你有一定的参考价值。

小游戏
题目描述
有一个简单的小游戏。游戏的主人公是一个勇士,他要穿过一片黑森林,去
解救公主。黑森林的地图可以用一张 V 个点、E 条边的无向图来描述,起点是 1
号点,终点是 V 号点。勇士从起点出发,出发时 HP 为 M,每单位时间可以选
择一条连接当前点的边,到达另一个点。图的边上有荆棘毒刺,而点上有供休憩
的小木屋,勇士每经过一条边会损失一定的 HP,每到达一个点则会回复一定的
HP。当 HP≤0 时,勇士死亡;HP 的上限为 M,当某一次休憩后 HP>M 时,
HP 将只能保留 M。勇士要在保证存活的前提下,尽快地到达目的地。
zzh 玩着这个小游戏,脑海里又浮现出她的微笑……他决定,一定要把游戏
玩通关!可是,随着关卡的进行,游戏的地图越来越大了……
输入格式
第一行三个整数,V、E、M。
第二行 V 个整数,第 i 个数表示第 i 个点每经过一次增加的 HP 值 R[i]。
接下来 E 行,每行三个整数 x、y、z,表示 x 号点到 y 号点有一条边,每经
过一次消耗 z 的 HP。
输出格式
一行一个整数,表示到达终点的最少时间。若无法到达,则输出-1。
输入样例
5 5 3
3 2 3 2 3
1 5 4
1 2 1
2 3 2
3 4 1
4 5 2
输出样例
4
样例解释
走路径 1——2——3——4——5。数据范围
测试点编号 V= E= M= z∈ R[i]∈
1
2 5 10 10 [0,20] [0,3]
3
4 20 50 20 [0,40] [0,10] 5 100 500 20
6 500 1000 500 [0,500] [0,200] 7 1000 5000 1000 [0,3000]
8 10000 50000 10000 [0,10000]
9 [0,100] 30000 100000 20000 [0,20000] 10
对于 100%的数据,保证图结构随机生成,保证 z 和 R[i]在对应范围内随机
生成。
 
sol:
考虑用 SPFA 迭代计算到达每个点存活且残余的最大 HP。考虑到 SPFA 本
身是一个广搜的过程,自然也可以类似广搜地统计最少时间。因此,直接跑 SPFA
即可。时间复杂度 O(EAns)。
 
技术图片
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()

    ll s=0; bool f=0; char ch= ;
    while(!isdigit(ch)) f|=(ch==-); ch=getchar();
    while(isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    return (f)?(-s):(s);

#define R(x) x=read()
inline void write(ll x)

    if(x<0) putchar(-); x=-x;
    if(x<10) putchar(x+0); return;
    write(x/10); putchar((x%10)+0);

#define W(x) write(x),putchar(‘ ‘)
#define Wl(x) write(x),putchar(‘\n‘)
const int N=30005,M=200005;
int n,m,mxhp,r[30005];
int tot=0,Next[200005],to[200005],val[200005],head[30005];
inline void Link(int x,int y,int z)

    Next[++tot]=head[x]; to[tot]=y; val[tot]=z; head[x]=tot;

int tou,wei;
struct Node

    int x,Hp,dis;
Que[20000005];
int arr[300005];
bool bo[N];
inline int bfs()

    int i; tou=1; wei=1;
    memset(arr,-63,sizeof arr);
    Que[++wei]=(Node)1,mxhp,0; arr[1]=mxhp;
    for(;tou<=wei;)
    
        Node tmp=Que[tou++]; if(tmp.x==n) return tmp.dis;
        arr[tmp.x]=max(arr[tmp.x],tmp.Hp);
        for(i=head[tmp.x];i;i=Next[i]) if(tmp.Hp>val[i])
        
            int oo=min(tmp.Hp-val[i]+r[to[i]],mxhp);
            if(arr[to[i]]<oo)
            
                arr[to[i]]=oo;
                Que[++wei]=((Node)to[i],oo,tmp.dis+1);
            
        
    
    return -1;

int main()

    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    int i,x,y,z;
    R(n); R(m); R(mxhp);
    for(i=1;i<=n;i++) R(r[i]);
    for(i=1;i<=m;i++)
    
        R(x); R(y); R(z); if(z<mxhp) Link(x,y,z); Link(y,x,z);
    
    Wl(bfs());
    return 0;
View Code

 

以上是关于7.26T3小游戏的主要内容,如果未能解决你的问题,请参考以下文章

7.26模拟赛总结

noip2008普及组t3传球游戏

洛谷P1312 [NOIOP2011提高组 Day1T3]Mayan游戏

刷题总结——mayan游戏(NOIP2011提高组day2T3)

[noip2011 d1t3] Mayan游戏

NOIP 2014 DAY1 T3飞扬的小鸟(DP)