zoukankan      html  css  js  c++  java
  • UVA 590

    UVA 590


    题意:
    好长的题看了好久= =
    有 n 个城市,编号 1~N, Trisha要坐飞机旅行 k 天,每天到一个城市,最后一天要到 N 城市。
    也就是起点是城市1,第 k 天要到达 N 城市。求 k 天旅行的最小花费。
    每个城市到其他城市都有一个航班表,x 天为周期,循环,接下来 x 个数表示航班价格。

    多组输入,每组第一行输入 n 和 k;输入 0 0结束。
    接下来 n(n-1)行,表示每个城市到其他城市的航班表。
    也就是说第 i 个 (n-1)行, 表示 城市 i 到其余(n-1)个城市的航班表。
    航班表第一个数表示周期天数,接下来每天的价格。

    例如:
    3 6 (n ,k n个城市,k 天。往下共 3*2行)
    2 130 150 (城市1到城市2的航班 2 天为一周期,第一天130,第二天150,第三天130..循环...)
    3 75 0 80 (城市1到城市3的航班 3 天为一周期,第一天75,第二天没有航班,第三天80..)
    7 120 110 0 100 110 120 0 (城市2到城市1....
    4 60 70 60 50 (城市2到城市3....
    3 0 135 140 (城市3到城市1....
    2 70 80

    解题:
    d[i][j] 表示 第 i 天到达第 j 个城市的最小花费。
    p[i][j][q] 表示从 i 城市到 j 城市的第 q 个价格(因为会循环所以轮到第 q 个);
    那么 d[i][j] = min (d[i][j], d[i-1][k] + pri[k][j][q]);
    就是 第 i 天到达第 j 个城市的最小花费等于
    第 i-1 天到达第 k 个城市的花费加上 k 到 j 的花费与原来统计结果两者取小。
    其中 j != k, 并且pri[k][j][q] != 0 (有航班可到达),d[i-1][k] != INF (到达过k城市);

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    
    int num[15][15], d[1010][15], pri[15][15][1010];
    
    int main()
    {
        int n, k, x, cas = 1;
        while (scanf ("%d%d", &n, &k) != EOF && (n || k)) {
            memset (pri, 0, sizeof (pri));
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j ++) {
                    if (i == j) continue;
                    scanf ("%d", &num[i][j]);
                    for (int k = 1; k <= num[i][j]; k ++) {
                        scanf ("%d", &pri[i][j][k]);
                    }
                }
            }
            memset (d, INF, sizeof (d));
            d[0][1] = 0;
            for (int i = 1; i <= k; i ++) {
                for (int j = 1; j <= n; j ++) {
                    for (int k = 1; k <= n; k ++) {
                        if (j == k) continue;
                        int q = (i-1) % num[k][j] + 1;
                        if (pri[k][j][q] != 0 && d[i-1][k] != INF )
                            d[i][j] = min (d[i][j], d[i-1][k] + pri[k][j][q]);
                    }
                }
            }
            printf ("Scenario #%d
    ", cas++);
            if (d[k][n] != INF)
                printf ("The best flight costs %d.
    
    ", d[k][n]);
            else printf ("No flight possible.
    
    ");
        }
        return 0;
    }
  • 相关阅读:
    java执行shell命令,chmod 777 xxx,改变权限无效的解决办法。
    SpringBoot配置双数据源(一个项目同时连接操作两台数据库)
    《机器学习》周志华西瓜书习题参考答案:第2章
    《机器学习》周志华西瓜书学习笔记(二):模型评估与选择
    只用一套解决方案,就可解决80%的交通物流行业信息难题
    原码、反码、补码
    400+节点的Elasticsearch集群运维
    史上最全PostgreSQL体系结构
    IDEA创建JAVAFX并打包成exe
    DB2 Zos 浅谈
  • 原文地址:https://www.cnblogs.com/ember/p/5800697.html
Copyright © 2011-2022 走看看