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

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

目录

  • T1. 道路
    • 思路分析
  • T2. Rainbow 的商店
    • 思路分析
  • T3. 冰阔落 I
    • 思路分析
  • 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(
http://www.xdnf.cn/news/15752.html

相关文章:

  • 安装tomcat启动startup.bat出现闪退问题
  • 驾驭 Spring Boot 事件机制:8 个内置事件 + 自定义扩展实战
  • windows wsl ubuntu 如何安装 maven
  • 前端知识回顾-登录界面
  • 实现el-select下拉框,下拉时加载数据
  • 【RK3576】【Android14】摄像头MIPI开发调试
  • [Python] -实用技巧10- 时间处理:datetime 和 time 模块入门
  • 【数据结构初阶】--双向链表(二)
  • 跨境卖家紧急自查,Endryko Karmadi四季版画版权维权
  • 【嵌入式电机控制#16】电流环(三):过采样提高采集精度看门狗监测总线电压
  • 【Linux系统】进程控制
  • 从0开始学习R语言--Day51--PH检验
  • OpenCV 官翻 1 -介绍、安装、功能概览、核心操作
  • 云计算与 DevOps(开发与运维)
  • sqli-labs靶场通关笔记:第32-33关 宽字节注入
  • Java 中的继承与多态
  • 基于GEE与哨兵2号的土地覆盖分类方法及实现
  • Vue Swiper组件
  • n8n教程分享,从Github读取.md文档内容
  • MySQL(145)如何升级MySQL版本?
  • 【爬虫】04 - 高级数据存储
  • Fortran实战:快速解析气象NC数据
  • OpenCV 官翻8 - 其他算法
  • 牛客-倒置字符串
  • SQL Server和PostgreSQL填充因子
  • debian的pulseaudio删掉也没事
  • SIMATIC WinCC Unified 使用 KPI 优化流程
  • Nacos配置管理
  • 【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析