本文为GESP 2023年9月 六级的上机题目详细题解和讲解视频,觉得有帮助或者写的不错可以点个赞。

题目一讲解视频

GESP2023年9月六级上机题一

题目二讲解视频

题目一:小羊买饮料

B3873 [GESP202309 六级] 小杨买饮料 - 洛谷

题目大意:

现在超市一共有n种饮料,每种饮料有对应的售价c元,和容量l毫升。

现在你每种饮料只能买一瓶,并且最后要买至少L毫升饮料。

请问在这个前提下,最少花多少钱。

解题思路:

很明显的背包dp。

我们回顾一下原始的01背包问题:

有n个物品,每个物品都有价值v,和重量w,背包容量是C,我们需要在小于等于C的背包容量下获取最大的价值。

这个题目呢,可以理解成,n个物品,每个物品都有价值c和容量i,我们必须要使得最终背包的容量大于等于L,并且让价值尽可能少!

经过上述分析,很明显就能想到以下的思路:

我们令dp[i][v]表示用前i个饮料,恰好凑到v升饮料的最小花费

我们最多可以达到tot = sum(l1,l2,l3,...ln)升饮料

那么对于第i个饮料,可以不

dp[i][j] = dp[i - 1][j]

或者买

令val = 第i个饮料的价值,c = 第i个饮料的容量

dp[i][j] = dp[i - 1][j - val] + c

使得价值最低,也就是

dp[i][j] = min(dp[i][j], dp[i - 1][j - val] + c)

然后呢,最终算的结果是对于前N个饮料,容量大于等于L的时候的最小价值。

也就是我们遍历j从L 到 mx,计算dp[N][j]的最小值。这个方法即使写成一维数组也会超内存,因为tot 的最大值为5e8。

我们需要优化一下。

我们可以注意到,只要是大于等于L的部分,都可以理解成是等于L的。

那么也就是我们dp数组实际大小只需要开到L + 1就可以了,实际计算的时候把大于L的部分算成L即可。

实际实现可以是,在遍历的时候,设置一个当前j可达的一个容量cur,cur = min(L, j + val)

如果dp[i - 1][j]可以达到,那么dp[i][cur] = min(dp[i][cur], dp[i - 1][j] + cost)

代码(C++):

#include <bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, L;std::cin >> n >> L;std::vector<int> c(n), l(n);for (int i = 0; i < n; i++) {std::cin >> c[i] >> l[i];}int inf = INT_MAX;std::vector dp(n + 1, std::vector<int> (L + 1, inf));dp[0][0] = 0;for (int i = 1; i <= n; i++) {//整层拷贝,表示不选dp[i] = dp[i - 1];int cost = c[i - 1], val = l[i - 1];for (int j = 0; j <= L; j++) {int cur = std::min(L, j + val);if (dp[i - 1][j] != inf) {dp[i][cur] = std::min(dp[i][cur], dp[i - 1][j] + cost);}}}int ans = dp[n][L];std::cout << (ans == inf ? "no solution" : std::to_string(ans));
}

题目二:小杨的握手问题

B3874 [GESP202309 六级] 小杨的握手问题 - 洛谷

题目大意:

现在有n个学生,编号为0到n -1,现在让这n个学生按照某个顺序进入教室。

当一个同学进入教室后,他需要和所有学号小于他的进行握手。

当所有同学按照某个顺序进入教室后,请问总共的握手次数是多少?

解题思路一:归并排序

这个题目可以抽象为,求一个数组中顺序对的个数。

为了方便,我们这里就求逆序对的数量cnt,然后用总对数减去cnt即为答案

下面是归并排序的原理图,每次把当前的数组分成一半,然后分到最后的时候进行合并。

我们可以在合并的过程中求逆序对数目,比如说合并7 3,是逆序的,逆序对数目加一

合并2 3 7 16和4 9 11 24,4是小于7的,那么4肯定小于7之后所有的数字。

代码一(C++):

#include <bits/stdc++.h>using i64 = long long;i64 mSort(std::vector<int>& a, std::vector<int>& tmp, int l, int r) {if (r - l <= 1) {return 0;}i64 cnt = 0;int m = (l + r) / 2;cnt += mSort(a, tmp, l, m);cnt += mSort(a, tmp, m, r);int i = l, j = m, k = l;while (i < m && j < r) {if (a[i] <= a[j]) {tmp[k] = a[i];k++;i++;} else {tmp[k] = a[j];cnt += m - i;j++;k++;}}while (i < m) {tmp[k] = a[i];i++;k++;}while (j < r) {tmp[k] = a[j];j++;k++;}for (int i = l; i < r; i++) {a[i] = tmp[i];}return cnt;
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; i++) {std::cin >> a[i];}std::vector<int> tmp(n);i64 tot = 1LL * n * (n - 1) / 2;i64 cnt = mSort(a, tmp, 0, n);std::cout << tot - cnt << "\n";
}

解题思路二:树状数组

我们可以这么理解题目,现在有一个长度为n的数组t, 并且刚开始都为0。

我们可以持续的进行下面这个过程求顺序对个数:

现在编号为x同学进入教室

我们可以把t[x]设置成1,并且看x前面有多少个1,前面的肯定是比当前x小的,也就是求前面部分的前缀和!

那么问题抽象成了,每次把x增加1,然后求[0, x - 1]的前缀和。可以用树状数组加速处理!

代码二(C++):

#include <bits/stdc++.h>using i64 = long long;// 模板来源:https://leetcode.cn/circle/discuss/mOr1u6/
// FenwickTree 模板(1-indexed)
template<typename T>
class FenwickTree {std::vector<T> tree;public:// 使用下标 1 到 nFenwickTree(int n) : tree(n + 1) {}// a[i] 增加 val, i 为 1-indexed// 时间复杂度 O(log n)void update(int i, T val) {for (; i < tree.size(); i += i & -i) {tree[i] += val;}}// 求前缀和 a[1] + ... + a[i]// 时间复杂度 O(log n)T pre(int i) const {T res = 0;for (; i > 0; i &= i - 1) {res += tree[i];}return res;}// 求区间和 a[l] + ... + a[r]T query(int l, int r) const {if (r < l) return 0;return pre(r) - pre(l - 1);}
};int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n;std::cin >> n;FenwickTree<int> ft(n);i64 ans = 0;for (int i = 0; i < n; i++) {int id;std::cin >> id;id += 1;ans += ft.pre(id);ft.update(id, 1);}std::cout << ans << "\n";
}

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

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

相关文章

linux 操作ppt

目录 方法1&#xff1a;用 libreoffice 打开PPT文件 播放脚本&#xff1a; 方法2&#xff1a;用 python-pptx 创建和编辑PPT 方法3&#xff1a;其他方法 在Linux中&#xff0c;可以使用Python通过python-pptx库来创建和编辑PPT文件&#xff0c;但直接播放PPT文件需要借助其…

元数据管理与数据治理平台:Apache Atlas 基本搜索 Basic Search

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 Apache Atlas 框架是一套可扩展的核心基础治理服务&#xff0c;使企业能够有效、高效地满足 Hadoop 中的合规性要求&#xff0c;并支持与整个…

LangChain4J-(1)-Hello World

一、LangChain4J是什么&#xff1f; LangChain4J 是一个专为 Java 生态系统设计的开源框架&#xff0c;用于简化与大语言模型&#xff08;LLM&#xff0c;如 OpenAI 的 GPT 系列、Google 的 Gemini、Anthropic 的 Claude 等&#xff09;的集成和交互。它借鉴了 Python 生态中 L…

HTTPS应用层协议-中间攻击人

HTTPS应用层协议-中间攻击人 • Man-in-the-MiddleAttack&#xff0c;简称“MITM 攻击” 确实&#xff0c;在方案 2/3/4 中&#xff0c;客户端获取到公钥 S 之后&#xff0c;对客户端形成的对称秘钥 X 用服务端给客户端的公钥 S 进行加密&#xff0c;中间人即使窃取到了数据&am…

利用 Makefile 高效启动 VIVADO 软件:深入解析与实践

利用 Makefile 高效启动 VIVADO 软件&#xff1a;深入解析与实践 系列文章目录 1、VMware Workstation Pro安装指南&#xff1a;详细步骤与配置选项说明 2、VMware 下 Ubuntu 操作系统下载与安装指南 3.基于 Ubuntu 的 Linux 系统中 Vivado 2020.1 下载安装教程 文章目录利用 …

[前端算法]排序算法

默认情况下&#xff0c;sort() 会将元素转换为字符串&#xff0c;然后按照 Unicode 编码的顺序进行排序&#xff1a; const fruits [apple, banana, cherry, date]; fruits.sort(); console.log(fruits); // 输出: ["apple", "banana", "cherry"…

C#标签批量打印程序开发

C#标签批量打印程序开发&#xff08;集成Bartender解决方案&#xff09;一、系统架构设计 1. 核心模块划分 public class LabelPrintingSystem {private IDataLoader _dataLoader; // 数据加载器private ITemplateEngine _templateEngine; // 模板引擎private IPrintControl…

ECC的原理、背景、工作机制和数学基础

ECC的原理、背景、工作机制和数学基础摘要&#xff1a;本文首先详细介绍ECC&#xff08;Error-Correcting Code&#xff0c;纠错码&#xff09;的原理&#xff0c;包括背景、工作机制和数学基础。然后&#xff0c;解释ECC在SRAM&#xff08;Static Random-Access Memory&#x…

计算机网络2-2:物理层下面的传输媒体

目录 导引型传输媒体 同轴电缆 双绞线 光纤 电力线 非导引型传输媒体 无线电波 微波 红外线 可见光 无线电频谱管理机构 导引型传输媒体 同轴电缆 双绞线 光纤 光在光纤中传播的基本原理 电力线 非导引型传输媒体 无线电波 微波 红外线 可见光 LiFi(可见光通信) …

Dify 从入门到精通(第 32/100 篇):Dify 的日志分析与监控

Dify 从入门到精通&#xff08;第 32/100 篇&#xff09;&#xff1a;Dify 的日志分析与监控 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a…

【IntelliJ IDEA】修改堆内存

idea卡顿&#xff0c;鼠标漂移修改idea文件打开 idea 安装路径&#xff0c;【bin】目录下【idea64.exe.vmoptions】文件修改【-Xms】最小内存【-Xmx】最大内存-Xms2048m -Xmx9216midea更改内存设置工具栏帮助更改内存设置设置堆大小上限为 文件 设置的最大内存保存并重启Leslie…

Docker与Docker Compose:容器世界的“单兵作战”与“军团指挥官”

在容器化技术的浪潮中&#xff0c;Docker和Docker Compose如同“双子星”&#xff0c;一个专注于单兵作战&#xff0c;一个擅长军团指挥。它们看似相似&#xff0c;却各司其职。对于开发者来说&#xff0c;理解它们的区别不仅能让代码部署事半功倍&#xff0c;更能避免踩坑。本…

进阶向:Python编写自动化邮件发送程序

Python编写自动化邮件发送程序&#xff1a;从零开始详解在数字化时代&#xff0c;自动化邮件发送功能已成为企业和个人提升工作效率的重要工具。据统计&#xff0c;全球每天发送的商业邮件超过30亿封&#xff0c;其中约40%是通过自动化系统发送的。这种功能被广泛应用于多种场景…

ChatGpt 5系列文章1——编码与智能体

人工智能技术正在以惊人的速度发展&#xff0c;重新定义着开发人员的工作方式。2025年8月&#xff0c;OpenAI正式发布了面向开发人员的GPT-5 一、GPT-5的编码能力突破 GPT-5在关键编码基准测试中创造了行业新纪录(SOTA)&#xff0c;在SWE-bench Verified测试中得分74.9%&…

力扣top100(day02-05)--二叉树 02

102. 二叉树的层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

开疆智能Ethernet转ModbusTCP网关连接发那科机器人与三菱PLC配置案例

本案例是三菱FX5U PLC通过ethernet/IP转ModbusTCP网关对发那科机器人进行控制的配置案例。PLC端主要配置以太网端口设置在通信测试中&#xff0c;PLC作为主站&#xff0c;在PLC设置中选择“以太网端口”非常关键&#xff0c;以确保通信测试的正常进行。1、首先&#xff0c;在PL…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-系统首页

在现代Web应用开发中&#xff0c;管理后台是几乎所有企业级应用不可或缺的部分。一个优秀的后台首页不仅需要提供清晰的信息展示&#xff0c;还需要具备良好的用户体验和视觉效果。本文将详细介绍如何使用Vue.js框架配合Element UI组件库和ECharts图表库&#xff0c;构建一个功…

第6节 torch.nn介绍

6.1 torch.nn.Module介绍 torch.nn.Module是 PyTorch 中构建神经网络的基础类&#xff0c;所有的神经网络模块都应该继承这个类。它提供了一种便捷的方式来组织和管理网络中的各个组件&#xff0c;包括层、参数等&#xff0c;同时还内置了许多用于模型训练和推理的功能。 官网…

python自学笔记7 可视化初步

图像的组成工具库 Matplotlib&#xff1a;绘制静态图 Plotly: 可以绘制交互式图片 图像的绘制&#xff08;Matplotlib&#xff09; 创建图形&#xff0c;轴对象 创造等差数列 # 包含后端点 arr np.linspace(0, 1, num11) # 不包含后端点 arr_no_endpoint np.linspace(0, 1, n…

GIS 常用的矢量与栅格分析工具

矢量处理工具作用典型应用缓冲区分析Buffer环境影响区域&#xff0c;空间邻近度分析等&#xff0c;例如道路周围一公里内的学校&#xff0c;噪音污染影响的范围裁剪Clip例如使用A市图层裁剪全国道路数据&#xff0c;获取A市道路数据交集Intersect识别与LUCC、分区洪水区、基础设…