2023年12月GESP C++七级编程题转Python真题解析

七、2023年12月GESP C++(Python)七级编程题

2023年12月GESP Python最高六级,但C++与Python同级编程题相同。本篇引用2023年12月GESPC++七级编程题,用Python实现。

【七级编程题1】

【试题名称】:商品交易

时间限制:1.0 s

内存限制:128.0 MB

【问题描述】

市场上共有N种商品,编号从0N-1,其中,第i种商品价值vi元。

现在共有M个商人,编号从0M-1。在第j个商人这,你可以使用第xj种商品交换第yj种商品。每个商人都会按照商品价值进行交易,具体来说,如果vxj>vyj,他将会付给你vyj-vxj元钱;否则,那么你需要付给商人vxj-vyj元钱。除此之外,每次交易商人还会收取1元作为手续费,不论交易商品的价值孰高孰低。

你现在拥有商品a,并希望通过一些交换来获得商品b。请问你至少要花费多少钱?(当然,这个最小花费也可能是负数,这表示你可以在完成目标的同时赚取一些钱。)

【输入描述】

第一行四个整数N,M,a,b,分别表示商品的数量、商人的数量、你持有的商品以及你希望获得的商品。保证0a,bN,保证ab

第二行N个用单个空格隔开的正整数v0,v1,…,vN-1,依次表示每种商品的价值。保证1vi≤10⁹

接下来M行,每行两个整数xj,yj,表示第j个商人愿意使用第xj种商品交换第yj种商品。保证0xj,yjN 保证xjyj

【输出描述】

输出一行一个整数,表示最少的花费。特别地,如果无法通过交换换取商品b,请输出No solution

【数据规模】

对于30%的测试点,保证N≤10M≤20

对于70%的测试点,保证N≤10³M≤10⁴

对于100%的测试点,保证N≤10⁵M≤2×10⁵

【分析】

bfs算法计算最短路径(交换次数),设交换k次。价格为v0,v1,…,vk,其中v0为源价格vavk为目标价格vb,所需费用为:

fee = k*1+(v1-v0)+(v2-v1)+…+(vk-1-vk-2)+(vk-vk-1) =k+vk-v0=k+vb-va

bfs时间复杂度O(M+N)2×10⁵+10⁵≤10⁶,不会超时。

【完整代码】
def bfs(src):
    qh = 0
    qt = 1
    queue[qt] = src
    min_dist[src] = 0
    while qh < qt:
        qh += 1
        u = queue[qh]
        for v in edge[u]:
            if min_dist[u] + 1 < min_dist[v]:
                min_dist[v] = min_dist[u] + 1
                qt += 1
                queue[qt] = v


n, m, src, dst = [int(i) for i in input().split()]     # 输入第1行4个参数
val = [int(i) for i in input().split()]                # 输入第2行n个参数,各商品价值
min_dist = [1000000000] * n                            # 10⁹大大于n≤10⁵
queue = [0] * (n + 1)
edge = [[] for i in range(n)]                          # 不能用[]*n,n行空列表
for _ in range(m):
    x, y = [int(i) for i in input().split()]           # m行成对参数
    edge[x].append(y)                                  # y添加到edge的x行
bfs(src)                                               # 广搜求最短距离(交换次数)
if min_dist[dst] > n:                                  # 距离大于n,超过商品数,无法通过交换换取
    print('No solution')
else:
    print(min_dist[dst] - val[src] + val[dst])
【运行结果】

【七级编程题2】

【试题名称】:纸牌游戏

时间限制:1.0 s

内存限制:128.0 MB

【问题描述】

你和小杨在玩一个纸牌游戏。

你和小杨各有3张牌,分别是012。你们要进行N轮游戏,每轮游戏双方都要出一张牌,并按1战胜02战胜10战胜2的规则决出胜负。第i轮的胜者可以获得2ai分,败者不得分,如果双方出牌相同,则算平局,二人都可获得ai(i=1,2,…,N)

玩了一会后,你们觉得这样太过于单调,于是双方给自己制定了不同的新规则。小杨会在整局游戏开始前确定自己全部n轮的出牌,并将他的全部计划告诉你;而你从第2轮开始,要么继续出上一轮出的牌,要么记一次换牌。游戏结束时,你换了t次牌,就要额外扣b1+b2+…+bt分。

请计算出你最多能获得多少分。

【输入描述】

第一行一个整数N,表示游戏轮数。

第二行N个用单个空格隔开的非负整数a1,a2,…,aN,意义见题目描述。

第三行N-1个用单个空格隔开的非负整数b1,b2,…,bN-1,表示换牌的罚分,具体含义见题目描述。由于游戏进行N轮,所以你至多可以换N-1次牌。

第四行N个用单个空格隔开的整数c1,c2,…,cN,依次表示小杨从第1轮至第N轮出的牌。保证ci∈0,1,2

【输出描述】

一行一个整数,表示你最多获得的分数。

【数据规模】

对于30%的测试点,保证N15

对于60%的测试点,保证N100

对于所有测试点,保证N≤1,000;保证0≤ai,bi≤10⁶

【分析】

由于数据N≤1,000,牌只有3张,采用枚举法也不会超时。本篇采用动态规划算法获得最优解

时间复杂度O(3N²)3×1000²<10⁷,不会超时。

【完整代码】
def point(x, y):
    if x == y + 1 or x == y - 2:                  # x赢得分系数2
        return 2
    elif x == y:                                  # 平局得分系数1
        return 1
    else:                                         # x输不得分,得分系数0
        return 0

n = int(input())
dp = [[-2000000000]*(n+1) for i in range(3)]      # 初始化为小于最高罚分:100*10⁶
a = [0]+[int(i) for i in input().split()]         # 数据索引从1开始
b = [0]+[int(i) for i in input().split()]         # 数据索引从1开始
c = [0]+[int(i) for i in input().split()]         # 数据索引从1开始
for j in range(3):
    dp[j][0] = point(j, c[1]) * a[1]              # 计算第1局出0、1、2得分
for i in range(2, n+1):
    for j in range(i-1, -1, -1):                  # 计算第2~n局出0、1、2得分
        for k in range(3):
            cur_score = point(k, c[i]) * a[i]
            dp[k][j] = dp[k][j] + cur_score
            if j > 0:
                for l in range(3):                # 计算换牌得分是否更高
                    dp[k][j] = max(dp[k][j], dp[l][j-1] + cur_score - b[j])
ans = -2000000000                                 # 初始化为小于最高罚分:100*10⁶
for j in range(n):                                # 找最高分即为答案
    for k in range(3):
        ans = max(ans, dp[k][j])
print(ans)                                        # 输出答案
【运行结果】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake入门教程【核心篇】引用子模块.cmake文件(include)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 include子模块举个例…

四、HTML 属性

属性是 HTML 元素提供的附加信息。 一、HTML 属性 HTML 元素可以设置属性属性可以在元素中添加附加信息属性一般描述于开始标签属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 二、 属性实例 HTML 链接由 <a> 标签定义。链接的地…

HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目&#xff0c;都用到了蓝牙模块&#xff0c;如&#xff1a;手机和stm32的通信&#xff0c;电赛中的双车通信&#xff0c;还是遥感小车的…

教育机构培训系统小程序功能清单

制作一款适合自己的教育机构培训系统小程序&#xff0c;可以为学员提供更便捷的学习体验&#xff0c;同时提高机构的教学效率。今天将详细介绍如何使用乔拓云平台制作教育机构培训系统小程序。 在浏览器搜索乔拓云&#xff0c;登录到后台&#xff0c;选择教育系统并点击进入。在…

使用MQTT.JS创建一个网页版的MQTT客户端

一、MQTT.JS介绍 MQTT.js 是一个开源的 MQTT 协议的客户端库&#xff0c;使用 JavaScript 编写&#xff0c;主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库。可以用于微信小程序、支付宝小程序等定制浏览器环境。 我们可以直接在HTML文件中进行调用…

静态代理、JDK动态代理、CGLIB动态代理以及JDK和CGLIB动态代理的区别

代理 什么是代理&#xff1f;两个设计原则三要素 静态代理静态代理的实现定义接口-定义行为静态代理 -> 目标角色静态代理-> 代理角色静态代理测试 特点 JDK动态代理newProxyInstance获取代理对象通过代理对象实现目标对象的功能特点 Java动态代理类中的invoke是怎么调用…

P8 RV1126推流 —— 摄像头和咪头模块初始化

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

对偶问题的基本性质

写于&#xff1a;2024年1月3日晚 修改于&#xff1a; 原规划与对偶规划 原规划对偶规划 max ⁡ z C T X s.t. { A X ≤ b , 其中 X ( m ∗ 1 ) X ≥ 0 \begin{aligned} & \max \mathrm{z}\mathbf{C}^T \mathbf{X} \\ & \text { s.t. }\left\{\begin{array}{l}\mat…

RFID在物流、供应链管理、工业自动化等领域的广泛应用

随着物联网技术的不断发展&#xff0c;RFID&#xff08;无线射频识别&#xff09;技术作为一种自动识别和跟踪技术&#xff0c;在物流、供应链管理、工业自动化等领域得到了广泛应用。本文将介绍RFID解决方案及其应用场景。 一、RFID技术概述 RFID是一种通过无线电波通信&…

Apache的配置与应用

目录 1、Apache简介 2、Apache连接保持 3、Apache的访问控制 3.1、客户机地址限制 3.2、用户授权限制 &#xff08;1&#xff09;创建用户认证数据文件 &#xff08;2&#xff09;添加用户授权配置 &#xff08;3&#xff09;验证用户访问授权 4、Apache日志分割 4…

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …

FreeRTOS——计数型信号量知识总结及实战

1计数型信号量概念 1&#xff09;计数型信号量相当于队列长度大于1 的队列&#xff0c;因此计数型信号量能够容纳多个资源 2&#xff09;适用场景&#xff1a; 事件计数&#xff1a; 当每次事件发生后&#xff0c;在事件处理函数中释放计数型信号量&#xff08;计数值1&#x…

shell编程二

shell 脚本规范 shell脚本文件需要以.sh结尾 第一个原因&#xff0c;让别人认的这个是shell脚本&#xff0c;sh后缀编辑时有高亮显示。 拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本 ​ # 执行脚本方式 1、 sh 脚本.sh 2、 bash 脚本.sh 3、 ./脚本.sh # 需要执行权…

【C语言】数组

㊙️小明博客主页&#xff1a;➡️ 敲键盘的小明 ㊙️ ✅关注小明了解更多知识☝️ 文章目录 前言一、什么是数组&#xff1f;二、一维数组的创建和初始化2.1 一维数组的创建2.2 一维数组的初始化2.3 一维数组的使用3.3 一维数组的存储 三、二维数组的创建和初始化3.1 二维数组…

每日一练:LeeCode-503. 下一个更大元素 II (中)【单调栈】

本文是力扣LeeCode-503. 下一个更大元素 II 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个…

【大数据实战】亿级数据量: 检索一个元素是否在一个集合中 [bloom过滤器及其应用]

目录 亿级数据量: 检索一个元素是否在一个集合中 [bloom过滤器]问题描述bloom过滤器简介传统方法哈希表bloom的思路 bloom过滤器为什么快&#xff1f;bloom过滤器更加节省空间&#xff01;优缺点实际应用javagopython 亿级数据量: 检索一个元素是否在一个集合中 [bloom过滤器] …

uniapp中用户登录数据的存储方法探究

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;作为一个博主&#xff0c;我们经常需要在应用程序中实现用户登录功能&#xff0c;并且需要将用户的登录数据进行存储&#xff0c;以便在多次使用应用程序时能够方便地获取用户信息。铁蛋通过科技手段帮大家收集整理了些知识&am…

python解决一维动态规划问题,寻找丑数

对于一维动态规划问题中&#xff0c;还有一个可能会经常遇到的问题&#xff0c;就是寻找丑数。 对于丑数的概念是&#xff0c;把只包含质因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添…

8、VS中Git使用

VS中Git使用 1.基础操作1.1 VS配置Git1.2 操作界面 2.本地库版本管理2.1 创建管理本地库2.2 暂存、存储2.3 提交2.4 版本切换 3.分支操作3.1 分支应用3.2 新建分支3.3 合并分支、解决冲突3.4 删除分支 4.远程库版本管理4.1 新建、克隆4.2 提取、拉取、推送与同步4.3 团队开发 最…

基于随机颜色反转合成和双分支学习的单模态内镜息肉分割

Single-Modality Endoscopic Polyp Segmentation via Random Color Reversal Synthesis and Two-Branched Learning 基于随机颜色反转合成和双分支学习的单模态内镜息肉分割背景难点贡献实验方法Color Reversal Strategy&#xff08;颜色反转策略&#xff09; 损失函数Thinking…
最新文章