zoukankan      html  css  js  c++  java
  • 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('
    ')
    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
  • 相关阅读:
    (转)基于REST架构的Web Service设计
    WPF 简易的喷泉效果
    C# 取Visio模型信息的简易方法
    WPF TextBox按字节长度限制输入
    NPOI导出WPF DataGrid控件显示数据
    WPF--TextBlock的ToolTip附加属性
    【转】WPF 从FlowDocument中找到Hyperlink
    WPF 初学VisifireChart
    WPF 简易进度条效果
    WPF 简易的跑马灯效果
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/11252740.html
Copyright © 2011-2022 走看看