当前位置: 首页 > news >正文

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

目录

  • T1. 道路
    • 思路分析
  • T2. 控制公司
    • 思路分析
  • T3. 发现它,抓住它
    • 思路分析
  • T4. 青蛙的约会
    • 思路分析

T1. 道路

题目链接:SOJ D1216

N N N 个以 1 ∼ N 1 \sim N 1N 标号的城市通过单向的道路相连,每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示)。

Bob 和 Alice 过去住在城市 1 1 1,在注意到 Alice 在他们过去喜欢玩的纸牌游戏中作弊后,Bob 和她分手了,并且决定搬到城市 N N N。他希望能够尽可能快的到那,但是他囊中羞涩。我们希望能够帮助 Bob 找到从 1 1 1 N N N 最短的路径,前提是他能够付的起通行费。

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

  • 输入
    第一行包含一个整数 K K K 0 ≤ K ≤ 10000 0 \le K\le 10000 0K10000,代表 Bob 能够在他路上花费的最大的金币数。
    第二行包含整数 N N N 2 ≤ N ≤ 100 2 \le N \le 100 2N100,指城市的数目。
    第三行包含整数 R R R 1 ≤ R ≤ 10000 1 \le R \le 10000 1R10000,指路的数目。
    接下来的 R R R 行,每行具体指定几个整数 S , D , L S, D, L S,D,L T T T 来说明关于道路的一些情况,这些整数之间通过空格间隔: S S S 是道路起始城市, 1 ≤ S ≤ N 1 \le S \le N 1SN D D D 是道路终点城市, 1 ≤ D ≤ N 1 \le D \le N 1DN L L L 是道路长度, 1 ≤ L ≤ 100 1 \le L \le 100 1L100 T T T 是通行费(以金币数量形式度量), 0 ≤ T ≤ 100 0 \le T \le100 0T100。注意不同的道路可能有相同的起点和终点。
  • 输出
    输入结果应该只包括一行,即从城市 1 1 1 到城市 N N N 所需要的最小的路径长度(花费不能超过 K K K 个金币)。如果这样的路径不存在,结果应该输出 − 1 -1 1
  • 样例输入
    5
    6
    7
    1 2 2 3
    2 4 3 3
    3 4 2 4
    1 3 4 1
    4 6 2 1
    3 5 2 0
    5 4 3 2
    
  • 样例输出
    11
    

思路分析

此题考查图论最短路径问题,是一道较好的基础应用题。

在数据量较小的情况下(大约 N ≤ 1000 N\le 1000 N1000),最短路径问题可以用 B F S \tt BFS BFS 进行求解,更快速的方式是使用堆优化的 D i j k s t r a \tt Dijkstra Dijkstra 算法。示例代码采用链式前向星存图,用堆(优先队列替代)优化的 D i j k s t r a \tt Dijkstra Dijkstra 算法求解最短路,通过运算符重载来规定优先队列中成员的优先级。

此题涉及到代价距离两个属性,应以距离为第一优先级参数,距离相同时,考虑代价为第二优先级参数。需要注意的是,优先队列默认为大根堆,可以通过重载小于号 < 实现小根堆,其中距离较长的元素的优先级高于距离较短者,代价较高的元素的优先级高于代价较低者(也可以通过给参与优先级比较的成员添加负号 - 来实现小根堆,免去运算符重载的麻烦)。

常规 D i j k s t r a \tt Dijkstra Dijkstra 算法通过定义 d i s t dist dist 数组存储从起点到每个点的最短路径长度,来限制只有更新了最短路径长度的顶点入队。此题应该限制代价不超过 k k k 的元素入队,与最短路径更新与否无关,因为距离最短的路径的总代价并不一定支付得起。也正因如此,每个顶点可能被其它代价更小的路径再次访问,不能添加标记数组对顶点进行分类。

/** Name: T1.cpp* Problem: 道路* Author: Teacher Gao.* Date&Time: 2025/05/14 22:48*/#include <bits/stdc++.h>using namespace std;// 链式前向星的数据结构
int to[10005], wl[10005], wt[10005], nxt[10005];
int head[105], tot;void add_edge(int x, int y, int w1, int w2) {++tot;to[tot] = y, wl[tot] = w1, wt[tot] = w2;	// 存储边信息nxt[tot] = head[x], head[x] = tot;			// 头插法
}int k, n, m;// 用于优先队列的数据结构
struct node {int dis, cost, id;bool operator < (const node &a) const {		// 重载小于号if (dis != a.dis) return dis > a.dis;	// 第一优先级return cost > a.cost;					// 第二优先级}
};int dijkstra(int s) {priority_queue<node> Q;Q.push({0, 0, 1});while (Q.size()) {node x = Q.top(); Q.pop();if (x.id == n) {return x.dis;}for (int i = head[x.id]; i; i = nxt[i]) {if (x.cost + wt[i] <= k) {Q.push({x.dis + wl[i], x.cost + wt[i], to[i]});}}}return -1;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> k >> n >> m;int x, y, w1, w2;for (int i = 1; i <= m; i++) {cin >> x >> y >> w1 >> w2;add_edge(x, y, w1, w2);}cout << dijkstra(1) << endl;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% 的股票。计算所有的数对

相关文章:

  • 安卓无障碍脚本开发全教程
  • 计算机网络中的单播、组播与广播
  • 41-牧场管理系统
  • 相向双指针 -- 灵神刷题
  • xdvipdfmx:fatal: File ended prematurely. No output PDF file written.
  • 【笔记】如何解决GitHub报错403
  • JAVA网络编程——socket套接字的介绍上(详细)
  • Python:从脚本语言到工业级应用的传奇进化
  • Vue.js教学第十四章:Vuex模块化,打造高效大型应用状态管理
  • 网络安全给数据工厂带来的挑战
  • 操作系统与底层安全
  • STM32 USART串口通信
  • Todesk 软件被锁定,不记得安全密码也进不去软件改不了问题解决
  • n 阶矩阵 A 可逆的充分必要条件是 ∣ A ∣ ≠ 0
  • 关于 Web 安全:4. 中间件 框架风险点分析
  • 危化品经营单位安全生产管理人员考试主要内容
  • 嵌入式Openharmony系统应用开发与实现方法
  • 【Leetcode 每日一题】2942. 查找包含给定字符的单词
  • HarmonyOS介绍
  • 多场景游戏AI新突破!Divide-Fuse-Conquer如何激发大模型“顿悟时刻“?
  • 网站建立网络优化/适合推广的app有哪些
  • 网站负责人拍照/手机系统优化工具
  • 池州网站建设公司/服务网站排名咨询
  • 奶茶加盟网站建设公司哪家好/seo门户网站优化
  • 一个网站需要几个人/百度站长平台账号购买
  • 手机版网站建设开发/西安网站制作公司