python 基础知识点(蓝桥杯python科目个人复习计划64)

今日复习内容:做题

例题1:蓝桥课程抢购

问题描述:

为了能让更多的同学学到IT技术,蓝桥云课又开始了课程限时打折活动。

作为初学者的你,希望尽可能买到含金量总额更高的课程,当然其他同学也是这么想。

由于购买课程的同学实在太多,蓝桥云课服务器宽带供不应求,导致同学们购买课程需要等待一定时间。

比如现在有3门课程:

《Java程序设计》需要等待3分钟,打折活动在3分钟后结束,该课程含金量为6;

《python程序设计》需要等待2分钟,打折活动在2分钟后结束,该课程含金量为3;

《c程序设计》需要等待1分钟,打折活动在3分钟后结束,该课程含金量为5。

方案一:选java,那么你可以抢购到含金量为6的课程。

方案二:可以先购买python,等待结束后再购买c,这样含金量就是8;

请注意,只能同时参与一门课程的抢购活动,且开始等待后不允许中途退出只有在打折活动有效期内才可以抢购课程。

输入格式:

第一行是一个整数N,代表蓝桥云课中有N门课程。

紧接着N行,每行3个正整数,A(购课等待时间),B(打折活动截止时间),C(课程含金量)。

输出格式:

输出一行一个整数,代表你能购买到课程最大的含金量总值。

参考答案:

def work():n = int(input())a = [[0,0,0]] + [list(map(int,input().split())) for i in range(n)]a.sort(key = lambda x:x[1])f = [[0]*(int(1e5) + 10)for i in range(n + 1)]for i in range(1,n + 1):for j in range(int(1e5) + 10):f[i][j] = f[i - 1][j]if a[i][1] >= j >= a[i][0]:f[i][j] = max(f[i][j],f[i - 1][j - a[i][0]] + a[i][2])print(max(f[n]))
if __name__ == '__main__':work()

运行结果:

 

以下是对此题的理解:

这道题是一个经典的动态规划问题,需要在有限的时间内选择购买课程以获取最大的含金量。

主要思路如下:

首先,从 输入中获取课程的数量n和没门课程的等待时间,结束时间和含金量。

对所有课程按照结束时间进行排序,这样可以方便后续的状态转移。

创建一个二维数组f,其中f[i][j]表示在前i门课程中,花费了j分钟等待时间所能获取的 最大含金量。

初始化f数组,将所有值设为0.

遍历每门课程,对于第i门课程:

遍历所有的等待时间j,如果当前课程的等待时间在[j,当前等待时间]的范围内,则更新f[i][j]为钱i - 1门课程中等待时间为j - 当前课程等待时间时的最大含金量加上当前课程的含金量。

最后,返回f[n][等待时间上限]中的最大值,即为最优解。


例题2:小兰的神秘礼物

问题描述:

小兰要过生日了,好朋友妮妮想送她一个礼物。妮妮找来了一个神秘的箱子,箱子的容量为v,她还收集了n个神秘的小物件,每个物件都有一个体积x。

妮妮想把这些物件中的一部分装进箱子里,当然也可以一个都不装。但是,为了增加神秘感,她希望箱子装得尽可能满,剩余的空间最小。你能帮妮妮计划一下,让她知道箱子最终的最小剩余空间吗?

输入格式:

第一行共一个整数V,表示箱子的容量。

第二行包含一个整数n,表示小物件的数量。

接下来n行,每行包含一个正整数x,表示第i个小物件的体积。

数据范围保证:0 < n <= 1000,1 <= x,v <= 1000

输出格式:

输出一个整数,表示箱子的最小剩余空间。

参考答案:

import os
import sys
v = int(input())
n = int(input())
f = [[0]*(v + 1) for i in range(n + 1 )]
for i in range(1,n + 1):vv = int(input())for j in range(v + 1):f[i][j] = f[i - 1][j]if j >= vv:f[i][j] = max(f[i][j],f[i - 1][j - vv] + vv)
print(v - f[n][v])

运行结果:

 

以下是我对此题的理解:

这道题目是一个经典的背包问题,需要在给定的箱子容量下,选择尽可能多的小物件装进箱子里,使得箱子装得尽可能满,剩余空间最小。

主要思路如下:

首先,从输入中获取箱子的容量和小物件的数量;

创建一个二维数组f,其中f[i][j]表示在前i个物件中,填满容量为j的箱子所剩余的最小空间;

初始化f数组,将其值全部设为0。

遍历每个小物件,对于第i个小物件:

遍历可能的箱子容量j,如果当前箱子容量j大于等于当前小物件的体积vv,则更新f[i][j]为前i - 1个物件中填满容量为j - 当前物件的体积vv的箱子所剩余的最小空间加上当前物件的体积vv;

最后,返回v与f[n][v]的差值,即为箱子所剩余的最小空间。


例题3:小蓝的神秘行囊

问题描述:

小蓝 是一名著名的探险家,他即将踏上异常特殊的寻宝冒险旅程。他的目标是寻找和收集各种神秘的宝物。他有一个神秘的行囊,能够装载各种物品。然而,这个行囊有一个特殊的规定:它的最大容量为v,并且它能承载的最大重量为m。

小蓝来到一个古老的城堡,里面有n件神秘的宝物,每件宝物只能被取走一次,每件宝物都有其特定的体积vi,重量mi和价值wi。

面对眼前的宝物,小蓝需要做出决定:将哪些宝物放入他的行囊,使得宝物的总体积不超过行囊的容量,总重量不超过行囊所能从承载的最大重量,且价值之和最大。

你的任务是帮助小蓝找出应该带走哪些宝物,并输出最大的宝物价值和。

输入格式:

第一行是3个整数n,v,m,分别用来表示宝物的数量,行囊的容量和能承载的最大重量。

接下来的n行,每行包括3个整数vi,mi,wi,分别表示每一个宝物的体积,重量和价值。

数据范围保证:0 < n <= 1000,0 < v,m <= 100,0 < vi,mi <= 100,0 < wi <= 1000

输出格式:

输出一个整数,表示可以装入行囊的宝物的最大价值。

参考答案:

n,v,m = map(int,input().split())
f = [[[0] * (m + 1)for i in range(v + 1)]for i in range(n + 1)]
for i in range(1,n + 1):vv,mm,ww = map(int,input().split())for j in range(v + 1):for k in range(m + 1):f[i][j][k] = f[i - 1][j][k]if j >= vv and k >= mm:f[i][j][k] = max(f[i][j][k],f[i - 1][j - vv][k - mm] + ww)
print(f[n][v][m])

运行结果:


例题4:加训啦

问题描述:

有一个兵营里面有n个士兵,每个士兵都有一个力量值ai。假设你是一名士兵长,你想通过训练,使得那么兵营的力量的下限尽可能大(兵营力量值的下限取决于兵营里面力量值最小的那个士兵)。

你有k点精力,m种训练计划,每种训练计划都有一个力量提升值bi,即一个士兵完成训练后,力量值会提升bi。

以及每种训练方法都有一个消耗值ci,即你每次分配训练计划你的精力都会消耗ci。

你可以消耗精力值分配训练方案给士兵,每种训练计划没有限制,即每个士兵可以训练任意训练计划 无数次,只要你的精力还够。

小蓝想让你告诉他,他的军营的兵营力量值的下限最大是多少?

输入格式:

输入共4行,第一行3个整数n,m,k,分别表示士兵数量,训练计划数和初始经历值。

第二行n个整数,表示每个士兵的初始力量值ai。

第3行m个正整数,表示每种训练计划的力量提升值 bi。

第4行m个正整数,表示每种训练计划的力量消耗值ci。

输出格式:

输出只有一行,表示兵营力量下限的最大值。

参考答案:

import math
def check(x):tot = 0for i in range(1,n + 1):if aa[i] < x:tot += f[m][x - aa[i]]return tot <= k
n,m,k = map(int,input().split())
aa = [0] + list(map(int,input().split()))
bb = [0] + list(map(int,input().split()))
cc = [0] + list(map(int,input().split()))
f = [[math.inf]*(int(1e4) + 100)for i in range(m + 1)]
f[0][0] = 0
for i in range(1,m + 1):for j in range(int(1e4) + 100):f[i][j] = min(f[i - 1][j],f[i][max(0,j - bb[i])] + cc[i])
left = 0
right = int(1e4) + 100
ans = -1while left <= right:mid = (left + right) // 2if check(mid):ans = midleft = mid + 1else:right = mid - 1print(ans)

运行结果:

 

以下是我对此题的理解:

这道题目是一个经典的贪心算法问题,需要通过训练计划来提升士兵的力量值,使得兵营的力量下限尽可能大。
这段代码的主要思路如下:
1. 首先,从输入中获取士兵数量n,训练计划数m,以及初始经历值k。
2. 获取每个士兵的初始力量值ai,并记录每种训练计划的力量提升值bi和力量消耗值ci。
3. 创建一个函数check(x),用于检查是否能够通过训练提升士兵的力量值至少为x。这个函数的实现逻辑是遍历每个士兵,如果其力量值小于x,则计算通过训练提升后的力量值是否能够达到x,如果达到则返回True,否则返回False。
4. 初始化二分查找的左右边界left和right,其中left初始化为0,right初始化为一个足够大的值(这里取了1e4 + 100)。
5. 使用二分查找的方式寻找力量下限的最大值。在每次迭代中,计算中间值mid,并调用check函数检查是否能够通过训练提升士兵的力量值至少为mid。如果能够达到,则更新ans为当前的mid,并将left更新为mid + 1;否则,将right更新为mid - 1。
6. 最终,输出ans即为兵营力量下限的最大值。
这样,代码利用贪心算法的思想,通过二分查找求解出兵营力量下限的最大值,从而达到优化士兵训练计划的目的。

我优化一下:

import math
def check(x):tot = 0for i in range(1,n + 1):if aa[i] < x:tot += f[x - aa[i]]return tot <= k
n,m,k = map(int,input().split())
aa = [0] + list(map(int,input().split()))
bb = [0] + list(map(int,input().split()))
cc = [0] + list(map(int,input().split()))
f = [math.inf]*(int(1e4) + 100)
f[0] = 0
for i in range(1,m + 1):for j in range(int(1e4) + 100):f[j] = min(f[j],f[max(0,j - bb[i])] + cc[i])
left = 0
right = int(1e4) + 100
ans = -1while left <= right:mid = (left + right) // 2if check(mid):ans = midleft = mid + 1else:right = mid - 1print(ans)

OK,今天就写到这里,下一篇继续! 

 

 

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

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

相关文章

ICV报告:《2023年全球未来产业指数报告》

随着科学技术的飞速发展&#xff0c;世界正在进入一个充满无限潜力的新时代&#xff0c;未来产业将逐渐成为各国竞争的焦点。 为了全面评估20多个国家和地区未来产业布局、发展、创新投资的能力&#xff0c;在世界知识产权组织(WIPO)、经济合作与发展组织(OECD)国际可再生能源…

vivado Placement、时钟和I/O放置、全局布局、详细布局和布局后优化

安置 Vivado Design Suite放置程序将网表中的单元放置到目标AMD中的特定站点上装置与其他实现命令一样&#xff0c;Vivado放置程序工作于并更新&#xff0c;内存中的设计。 设计布局优化 Vivado砂矿器同时优化了以下方面的设计布局&#xff1a; •定时松弛&#xff1a;选择…

扩展资料主机名到IP地址的有两种方式:DNS

中国联通的DNS地址有两种。 主 DNS 为“210.21.4.130”&#xff0c;备用 DNS 为“221.5.88.88”。 每个 IP 地址可以有一个主机名。 主机名由一串或多串字符组成。 用小数点分隔字符串。 对于中国联通宽带用户&#xff0c;主DNS设置为&#xff1a;210.21.4.130&#xff0c;备用…

【CTF笔记】 CTF web方向笔记分享 免费 附预览图

个人不怎么记东西&#xff0c;笔记不多&#xff0c;师傅们凑合看… 百度网盘&#xff1a;https://pan.baidu.com/s/1PspihUX28Y_AOQZPurHqKA 麻烦各位师傅帮忙填写一下问卷&#xff0c;提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 &#xff08;…

C++面试题和笔试题(四)

一、intx[6][4],(*p)[4];px;则*(p2)指向哪里&#xff1f; A X[0][1]B X[0][2]C X[1][0]D X[2][0] 官方解释&#xff1a; D int x[6][4], (*p)[4]; p x; 在这里&#xff0c;x 是一个二维数组&#xff0c;它有6行和4列。p 是一个指向具有4个整数的数组的指针。 当你执行…

鸿蒙Next学习-Flex布局

Entry Component struct FlexCase {build() {//需要在构造参数上传Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.Center }) {//flex布局Row().width(100).height(100).backgroundColor(Color.Red)Row().width(100).height(100).backgroundColor(Color.Yellow…

【DL经典回顾】激活函数大汇总(十三)(Sinc SwiGLU附代码和详细公式)

激活函数大汇总&#xff08;十三&#xff09;&#xff08;Sinc & SwiGLU附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可…

使用智能型档案密集架的原因及意义是什么

智能密集架是一种具有智能化功能的存储设备&#xff0c;用于存放和管理各种物品或设备。它通常采用高度集成的设计&#xff0c;能够最大限度地利用储物空间&#xff0c;实现物品的紧凑存放。 使用专久智能智能型档案密集架的原因和意义有以下几点&#xff1a; 1. 节省空間&…

外卖平台订餐流程架构的实践

当我们想要在外卖平台上订餐时&#xff0c;背后其实涉及到复杂的技术架构和流程设计。本文将就外卖平台订餐流程的架构进行介绍&#xff0c;并探讨其中涉及的关键技术和流程。 ## 第一步&#xff1a;用户端体验 用户通过手机应用或网页访问外卖平台&#xff0c;浏览菜单、选择…

openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优

文章目录 openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优243.1 子查询调优243.1.1 子查询背景介绍243.1.2 openGauss对SubLink的优化243.1.3 更多优化示例 openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优 SQL调优是一…

解决安装 unbantu 后,桌面字体太小,无法调节的问题

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 一、问题描…

什么软件可以剪辑录音?录音剪辑推荐3款工具

随着数字技术的发展&#xff0c;录音已经成为我们日常生活和工作中不可或缺的一部分。无论是会议记录、课堂笔记&#xff0c;还是音乐创作、语音聊天&#xff0c;我们都需要用到录音功能。然而&#xff0c;单纯的录音往往不能满足我们的需求&#xff0c;我们还需要对录音进行剪…