USST-vj-蓝桥杯训练-2025.03.22

news/2025/3/22 2:37:26/文章来源:https://www.cnblogs.com/YoruKiri/p/18786143

题目难度感觉是顺序的,就顺着讲了(虽然乱序的情况我也顺着讲)

A

题意简单明了,升序排序输出即可

#include <bits/stdc++.h>
using namespace std;int main() {int n, m;cin >> n >> m;vector<int> a(m);for (int i=0; i<m; i ++) {cin >> a[i];}sort(a.begin(), a.end());for (auto &x: a) {cout << x << ' ';}return 0;
}

B

数学题
首先我们要想清楚总时间最短可以转化为什么问题,显然就是尽量让车和两个人都没停下来,也就是最后一定是走路的人和车同时到终点,那么后面走路的人一定是先上车的。
那么在距离为 d 的位置放下 1 号乘客,转头去接 2 号,这样做是更优的。
我们还要思考如果我频繁地来回接送会更优吗?显然不会的,因为两个人只有编号的区别,那么调头换人上车的过程中就会出现只有人的速度做贡献的情况,所以只进行一次调头换人上车是最优的。
现在,我们把过程稍微抽象一下

  • 第一阶段:1 号从左端点以 a 的速度向右走,车和 2 号从左端点以 b 的速度向右走
  • 第二阶段:1 号继续向右走,2 号在 d 处被放下,向右端点走,车从 d 处向左走
  • 第三阶段:1 号遇到车上车,以 b 的速度向右走,2 号尚未走到右端点
  • 第四阶段:1 号坐车和走路的 2 号同时抵达终点
    我们可以注意到,这个过程是完全对称的,这意味着 2 号下车的位置和 1 号上扯的位置也是对称的
    那么 1 号就是在 s - d 处上的车,这可以简化我们的运算
    以时间列等式

\[\begin{align} \frac{s - d}{a} &= \frac{d + (2d - s)}{b} \\ d &= \frac{sb + sa}{3a+b} \end{align} \]

总时间就是 \(\frac{s-d}{a} + \frac{d}{b} \rightarrow \frac{4d-s}{b}\)

#include <bits/stdc++.h>
using namespace std;int main() {double s, a, b;cin >> s >> a >> b;double d = (s*b + s*a) / (3*a + b);double t = (4*d - s) / b;cout << fixed << setprecision(6) << t << endl;return 0;
}

C

这道题是考察对栈的基础运用

用栈维护尚未配对的 ( 和 [ ,然后用一个数组记录每一位的字符是否需要在其相邻位置补充配对括号。
具体实现可看代码,代码中涉及到两个 char 变量的加减运算,这与他们的 ASCII 码有关,主要用处是把多个判断化简为一个

#include <bits/stdc++.h>
using namespace std;int main() {string s;cin >> s;stack<int> st;vector<bool> v(s.size());for (int i=0; i<s.size(); i++) {char c = s[i];if (c == '(' || c == '[') st.push(i);else if (st.empty() || abs(c - s[st.top()]) > 2) v[i] = true;else if (!st.empty()) st.pop();}while (!st.empty()) {v[st.top()] = true;st.pop();}for (int i=0; i<s.size(); i++) {if (v[i]) cout << (s[i] <= ')'? "()": "[]");else cout << s[i];}return 0;
}

D

一道模拟题,考察队列的基础使用

因为当数量超过上限时,删除最早加入的,那么就符合先进先出原则,使用队列模拟,
然后用一个 vis 数组记录每个词在不在快速翻译的列表中

细节见代码

#include <bits/stdc++.h>
using namespace std;int main() {int n, m;cin >> m >> n;vector<bool> vis(1001);queue<int> q;int cnt{ 0 };for (int i = 1; i <= n; i ++) {int x;cin >> x;if (!vis[x]) {q.push(x), vis[x] = true;if (q.size() > m) vis[q.front()] = false, q.pop();cnt ++;}}cout << cnt;return 0;
}

E

题目说到最多 6 个单词,也就意味着最多 6 个数字,因此可以暴力枚举每一种排列方式,复杂度最多是 6! ,要注意如果 \(x^2\ mod\ 100 = y < 10\) ,那么实际组合时是拼接 0y 而不是 y
next_permutation 是一个库函数,可以返回一个刚好比传入数组字典序小的另一种排列方式,想详细了解可以取网上学习。这道题只需知道,在升序排序数组后,使用示范代码中的 do-while 循环可以枚举出每一种排列方式

#include <bits/stdc++.h>
using namespace std;map<string, int> num;void init() {num["one"] = 1, num["two"] = 2, num["three"] = 3, num["four"] = 4, num["five"] = 5;num["six"] = 6, num["seven"] = 7, num["eight"] = 8, num["nine"] = 9, num["ten"] = 10;num["eleven"] = 11, num["twelve"] = 12, num["thirteen"] = 13, num["fourteen"] = 14, num["fifteen"] = 15;num["sixteen"] = 16, num["seventeen"] = 17, num["eighteen"] = 18, num["nineteen"] = 19, num["twenty"] = 20;num["zero"] = 0;num["a"] = 1, num["both"] = 2, num["another"] = 1, num["first"] = 1, num["second"] = 2, num["third"] = 3;
}int main() {init();string s;vector<int> x;while (cin >> s) {if (s.back() == '.') s = s.substr(0, s.size() - 1);for (auto &ch: s) {if (ch <= 'Z') ch += 32;}if (num.count(s)) x.push_back(num[s] * num[s] % 100);}sort(x.begin(), x.end());long long ans{ 0x3f3f3f3f3f3f3f3f };do {long long res{ 0 };for (auto &i: x) {res *= 100;res += i;}ans = min(ans, res);} while (next_permutation(x.begin(), x.end()));cout << ans;return 0;
}

F

这是一道贪心题

因为每一个有泥的地方都要盖上,还要最少木板,所以我们按淤泥区间的左端点升序排序,每次找到最左边没有被盖住的淤泥,然后更新到木板覆盖的范围,因为从左到右遍历,所以已经覆盖的地方的左边一定是全部淤泥都被覆盖的。
对于有重合的区间,如果淤泥已经被覆盖,那么第一个有淤泥的点一定在这个区间左端点的右边,不会重复。

#include <bits/stdc++.h>
using namespace std;int main() {int n, L;cin >> n >> L;vector<pair<int, int>> a(n);for (int i = 0; i < n; i ++) {cin >> a[i].first >> a[i].second;}sort(a.begin(), a.end());int ans{ 0 }, l{ 0 };for(int i = 0; i < n; i ++) {l = max(l, a[i].first);ans += (a[i].second - l + L-1) / L;l += (a[i].second - l + L-1) / L * L;}cout << ans;return 0;
}

G

这也是可以贪心做的题

我们可以想到,如果走到最后才回头还钱,那么本来在中途只需要回头一步的情况,就会在最后需要额外走终点到当前为止的距离,所以只要当前的钱足够还清之前累积的债务,那么就立刻回头,想到这个代码就很好写了

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;vector<int> a(n+1);queue<int> q;for (int i = 1; i <= n; i ++) {cin >> a[i];if (a[i] < 0) q.push(i);}int ans{ n }, sum{ 0 }, lst{ 0 }, l{ n+1 };for (int i = 1; i <= n; i ++) {if (a[i] > 0) {sum += a[i];if (sum >= lst && lst) {ans += 2 * (i - l);sum -= lst;lst = 0, l = n+1;}} else {if (sum + a[i] >= 0) {sum += a[i];} else {lst -= a[i];l = min(i, l);}}}cout << ans;return 0;
}

H

这是一道 01 背包扩展来的分组背包,而且是一道板子题
思路就是从「在所有物品中选择一件」变成了「从当前组中选择一件」,于是就对每一组进行一次 0-1 背包就可以了。
对于数据的存储,我们正常存储每件物品的重量和价值后,分组只需记录对应索引即可
更加详细的讲解可以去看洛谷的「背包九讲」或 OI Wiki

#include <bits/stdc++.h>
using namespace std;int main() {int n, m;cin >> m >> n;vector<long long> a(n+1), b(n+1), dp(m+1, 0);map<int, vector<int>> c;for (int i = 1; i <= n; i++) {int k;cin >> a[i] >> b[i] >> k;c[k].push_back(i);}for (auto [k, y]: c) {for (int i = m; i >= 0; i --) {for (auto x: y) {if (i >= a[x]) dp[i] = max(dp[i], dp[i-a[x]] + b[x]);}}}cout << dp[m];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AbstractAutoProxyCreator#postProcessBeforeInstantiation

一、定义 postProcessBeforeInstantiation 是 Spring AOP 动态代理的核心扩展点,通过提前创建代理对象优化性能,并支持丰富的自定义逻辑(如事务、安全) 二、代码分析 public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws Be…

Day20_javascanner_struct

Java JavaDoc javadoc命令是用来生成自己API文档的 参数信息: @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @return 返回值情况 @throws 异常抛出情况 /*** @author XXX* @version 1.0* @since 1.8*/public class Doc {String name;/*** …

k8s基本字段

k8s基本字段 limits字段 此字段限制的是硬件的资源,如果容器尝试申请超过限制的内存将会终止容器 requests字段 此字段限制的是容器可以请求的资源,可以超出request申请额外的资源,但是不能超过limits, 500m等于0.5个CPU本地临时性文件,采用这种配置时,你会把所有类型的临…

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(3)

比赛链接 本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。 跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18786128 开题 + 补题情况 很菜的一把,就开了三个签到题,1001 Lucas 定理花了好久才看出来,明明…

51单片机学习笔记-3

串口通信UART(universal asynchronous receiver transmitter,通用异步收发器):可用来实现串口通信。串口硬件:基础串口包含TXD/RXD两个通信线,他们交叉连接。(如DB9通常使用2(RXD),3(TXD),5(GND)。) 当串口两头电平标准不一样时,需要叫电平转换芯片。TTL电平:5V表示1,…

微信小程序 -2025/3/22

HttpClient 介绍:核心api发送请求步骤小程序目录结构小程序页面组成微信登录 发送请求

应用打包测试

用HBuilder打包了一个之前写着玩的html页面

小白与Android Studio的初遇

新手小白在Android Studio上运行程序的时候遇到俩问题,通过在网上各种找解决方法,最终解决了(然后就想起来继续写博客这件事儿了)。 【第一个问题】关于“Error runningapp:No target device found”。就是它找不到设备(虚拟机或者真机),所以配置虚拟机就行了。 (当我以…

20234220 实验一《Python程序设计》实验报告

20234220 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2342 姓名: 马燕秋 学号:20234220 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练…

Echarts-普通地图和3D地图实现

效果图实现代码 <template><div class="app"><h1>普通地图----------------</h1><div class="map-container" ref="map_ref"></div><h1>3D地图----------------</h1><div class="map-c…

Navicat Premium 16 For Mac 激活,无限试用,非破解,官网安装程序,Mac版Navicat无限试用

Navicat Premium 16 For Mac 激活,无限试用,非破解,官网安装程序,Mac版Navicat无限试用Navicat Premium是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle、MariaDB、Mssql、及 PostgreSQL 资料库,让管理不同类型的资料库更加的方…