2023 年 9 月青少年软编等考 C 语言八级真题解析

T1. 最短路径问题

题目链接:SOJ D1249

平面上有 n n n 个点( n ≤ 100 n\le 100 n100),每个点的坐标均在 − 10000 ∼ 10000 -10000\sim 10000 1000010000 之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

时间限制:1 s
内存限制:128 MB

  • 输入
    n + m + 3 n+m+3 n+m+3 行,第一行为整数 n n n
    2 2 2 行到第 n + 1 n+1 n+1 行(共 n n n 行) ,每行两个整数 x x x y y y,描述了一个点的坐标。
    n + 2 n+2 n+2 行为一个整数 m m m,表示图中连线的个数。
    此后的 m m m 行,每行描述一条连线,由两个整数 i i i j j j 组成,表示第 i i i 个点和第 j j j 个点之间有连线。
    最后一行两个整数 s s s t t t,分别表示源点和目标点。
  • 输出
    仅一行,一个实数(保留两位小数),表示从 s s s t t t 的最短路径长度。
  • 样例输入
    5
    0 0
    2 0
    2 2
    0 2
    3 1
    5
    1 2
    1 3
    1 4
    2 5
    3 5
    1 5
    
  • 样例输出
    3.41
    

思路分析

此题考查最短路径问题,属于模板题。常规情况下,最好选用 D i j k s t r a \tt Dijkstra Dijkstra 算法进行求解,不过此题数据量较小,可以使用代码更为简单的 F l o y d \tt Floyd Floyd 算法求解。

/*
 * Name: T1.cpp
 * Problem: 最短路径问题
 * Author: Teacher Gao.
 * Date&Time: 2025/07/18 15:25
 */

#include <iostream>
#include <cmath>

using namespace std;

int x[105], y[105];
double g[105][105];

double dis(int u, int v) {
   
   
    return sqrt((x[u] - x[v]) * (x[u] - x[v]) + (y[u] - y[v]) * (y[u] - y[v]));
}

int main()
{
   
   
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m, u, v;
    fill(g[0], g[0] + 105 * 105, 1e9);

    cin >> n;
    for (int i = 1; i <= n; i++) {
   
   
        cin >> x[i] >> y[i];
        g[i][i] = 0;
    }

    cin >> m;
    for (int i = 1; i <= m; i++) {
   
   
        cin >> u >> v;
        g[u][v] = g[v][u] = dis(u, v);
    }

    for (int k = 1; k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (g[i][j] > g[i][k] + g[k][j])
                    g[i][j] = g[i][k] + g[k][j];

    cin >> u >> v;
    printf("%.2lf", g[u][v]);

    return 0;
}

T2. 控制公司

题目链接:SOJ D1217

有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分。例如,福特公司拥有马自达公司 12 % 12\% 12% 的股票。据说,如果至少满足了以下条件之一,公司 A 就可以控制公司 B 了:

  • 公司 A = = = 公司 B。
  • 公司 A 拥有大于 50 % 50\% 50% 的公司 B 的股票。
  • 公司 A 控制 K   ( K ≥ 1 ) K\ (K \ge 1) K (K1) 个公司,记为 C 1 , . . , C K C_1, .., C_K C1,..,CK,每个公司 C i C_i Ci 拥有 x i % x_i\% xi% 的公司 B 的股票,并且 x 1 + . . + x K > 50 % x_1 + .. + x_K > 50\% x1+..+xK>50%。(PS:A 可以控制自己,即 C i C_i Ci 可以为 A)。

你将被给予一系列的三对数 ( i , j , p ) (i,j,p) (i,j,p),表明公司 i i i 拥有公司 j j j p % p\% p% 的股票。计算所有的数对 ( h , s ) (h,s) (h,s),表明公司 h h h 控制公司 s s s

时间限制:1 s
内存限制:64 MB

  • 输入
    第一行: N N N,表明接下来三对数的数量。
    第二行到第 N + 1 N+1 N+1 行:每行三个整数作为一个三对数 ( i , j , p ) (i,j,p) (i,j,p),如题目所述。 N , i , j , p ≤ 100 N,i,j,p≤100 N,i,j,p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南朔 Clancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值