zoukankan      html  css  js  c++  java
  • 洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)

    题目描述

    汤姆斯生活在一个等级为0的星球上。那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为N的星球上天堂般的生活。

    有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱。

    汤姆斯预先知道了从0等级星球去N等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线。

    输入输出格式

    输入格式:

     

    第一行一个正整数N(N≤100),接下来的数据可分为N个段落每段的第一行一个整数Ki(Ki≤100),表示等级为i的星球有Ki个。

    接下来的Ki行中第Tij个依次表示与等级为i,编号为j的星球相连的等级为i-1的星球的编号和此航线需要的费用(正数表示支出,负数表示收益,费用的绝对值不超过1000)。

    每行以0结束,每行的航线数≤100。

     

    输出格式:

     

    输出所需(或所得)费用。正数表示支出,负数表示收益。

     

    输入输出样例

    输入样例#1:
    3
    2
    1 15 0
    1 5 0
    3
    1 -5 2 10 0
    1 3 0
    2 40 0
    2
    1 1 2 5 3 -5 0
    2 -19 3 -20 0
    输出样例#1:
    -1

    说明

    对于100%的数据N≤100 Ki≤100。

    样例解释:

    思路:本层的是由上层的状态转移过来的。设两个数组:f,ff。f表示本层的状态,ff表示上一层的状态。那f[j]=min(f[j],ff[y]+z),然后用f去更新ff即可。

    本题还应注意一个坑点:负数表示收益,正数表示支出。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    int n,x,ans=0x3f3f3f,f[300],ff[300];
    using namespace std;
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            memset(f,0x3f,sizeof(f));
            cin>>x;
            for(int j=1;j<=x;j++){
                int y,z;
                while(cin>>y&&y!=0){
                    cin>>z;
                    f[j]=min(f[j],ff[y]+z);
                }
            }
            for(int j=1;j<=x;j++)
                ff[j]=f[j];
        }
        for(int i=1;i<=x;i++)
            ans=min(f[i],ans);
        cout<<ans;
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    畅通工程续 dijkstra
    能量项链 区间dp
    机器人军团
    skiing
    数论知识
    灯泡游戏
    60. 第k个排列
    17. 电话号码的字母组合
    101. 对称二叉树
    144. 二叉树的前序遍历
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7424256.html
Copyright © 2011-2022 走看看