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

今日复习计划:做复习题

例题1:大石头的搬运工

问题描述:

在一款名为“大石头的搬运工”的游戏中,玩家需要 操作一排n堆石头,进行n - 1轮游戏。

每一轮,玩家可以选择一堆石头,并将其移动到任意位置。

在n - 1轮游戏移动结束时,要求将所有的石头移动到一起(即所有石头的位置相同)即为成功。

移动的费用为石头的重量乘以移动的距离。例如,如果一堆重量为2的石头从位置3移动到位置5,那么费用为2 * (5 - 3) = 4.

请计算出所有合法方案中,将所有石头移动到一起时的最少费用。

可能有多堆石头在一个位置上,但是一轮只能选择移动其中一堆。

输入格式:

第一行一个整数n,表示石头的数量。

接下来n行,每行两个整数wi和pi,分别表示第i个石头的重量和初始位置。

输出格式:

输出一个整数,表示最小的总移动费用。

参考答案:

import math
n = int(input())
li = []
for i in range(n):
    li.append(list(map(int,input().split())))
li.sort(key = lambda x:x[1])
pre = [0]
nex = [0]
s1 = li[0][0]
s2 = li[-1][0]
for i in range(1,n):
    pre.append(pre[-1] + (s1)*(li[i][1] - li[i-1][1]))
    s1 += li[i][0]
for i in range(n-2,-1,-1):
    nex.append(nex[-1] + (s2)*(li[i+1][1] - li[i][1]))
    s2 += li[i][0]
nex.reverse()
res = math.inf
for i in range(n):
    res = min(res,pre[i] + nex[i])
print(res)

运行结果:

以下是我对此题的理解:

import math:

这行导入了python的math模块,用于进行数学计算。

n = int(input())

li = []

for i in range(n):li.append(list(map(int,input().split())))

首先,从标准输入读取一个整数n,表示石头的数量。然后,通过一个循环读取n行输入,每行包括两个整数wi和pi,分别表示第i个石头的重量和初始位置,这些信息以列表的形式存储在li中

li.sort(key = lambda x:x[1])

对列表li按初始位置进行排序,以便后续计算。

pre = [0]

nex = [0]

s1 = li[0][0]

s2 = li[-1][0]

初始化四个变量:pre,nex,s1,s2。pre和nex分别用于储存每个位置左侧和右侧的移动总费用,而s1和s2分别表示左侧和右侧的石头重量之和的累加值,初始值分别为第一个和最后一个石头的重量。

for i in range(1,n):pre.append(pre[-1] + (s1)*(li[i][1] - li[i-1][1]))

s1 += li[i][0]

接下来,变量列表li中的每个石头,计算每个石头左侧的移动总费用。对于每个位置i,其左侧移动总费用等于前一个位置的左侧移动总费用加上当前位置的移动费用,其中移动费用等于当前位置当前位置左侧石头重量之和乘以当前位置与前一个位置的距离。更新s1为当前位置左侧的石头重量之和。

for i in range(1,n)

这个循环从1开始到n - 1结束,遍历除了第一个石头以外的所有石头。因为第一个石头的位置是我们用来初始化s1的起点,所以不需要再次计算它的移动费用

pre.append(pre[-1] + (s1)*(li[i][1] - li[i-1][1]))

这行代码是计算并存储到当前位置i为止,所以左侧石头移动到当前位置的总费用,pre[-1]是上一个位置的移动总费用,(s1)*(li[i][1] - li[i-1][1])是从上一个位置到当前位置的移动费用,其中s1是到当前位置为止,左侧所有石头的重量和,li[i][1] - li[i-1][1]是当前位置与上一个位置的距离。将这两者相加得到当前位置的总移动费用,并将其追加到pre列表中

s1 += li[i][0]

这行代码更新了s1的值。每遍历到一个新的位置,都将当前位置的石头重量加到s1上,因此s1始终保持为到当前位置为止,左侧所有石头的重量和。

for i in range(n - 2,-1,-1)

这个循环从倒数第二个石头开始向左遍历,直到第一个石头。因为最后一个石头的位置是我们用来初始化s2的起点,所以不需要再次计算它的移动费用

nex.append(nex[-1] + (s2)*(li[i + 1][1] - li[i][1]))

这行代码是计算并储存到当前位置i为止,所有右侧石头移动到当前位置的总移动费用,nex[-1]是上一个位置的总移动费用,(s2)*(li[i + 1][1] - li[i][1])是从上一个位置移动到当前位置的移动费用,其中s2是到当前位置为止,右侧所有石头的重量和,li[i + 1][1] - li[i][1]是当前位置与下一个位置之间的距离。将这两者相加得到当前位置的总移动费用,并将其追加到nex列表中。

s2 += li[i][0]:这行代码更新了s2的值,每遍历到一个新的位置,将当前石头的重量叠加到s2上,因此s2始终保持为到当前位置为止,右侧所有石头的重量和。

nex.reverse():最后,由于我们是从左向右计算移动费用的,得到的nex列表中元素的顺序与实际的位置顺序相反,所以需要将nex翻转过来,以便后续计算最小总移动费用是能够对应正确位置。


例题2:最大数组和

问题描述:

小明是一名勇敢的探险家,他在一次探险途中发现了一组神秘的宝石,这些宝石的价值都不同。但是,他发现这些宝石会随着时间的推移逐渐失去价值,因此他必须在规定的次数内对它们进行处理。

小明想要最大化这些宝石的总价值。他有两种处理方式:

1.选出最小的两个宝石,并将他们从宝石组中删除。

现在,给你小明手上的宝石组,请你告诉他在规定的次数内,最大化宝石的总价值是多少。

输入格式:

第一行包含一个整数t,表示数据组数。

对于每组数据,第一行包含两个整数n和k,表示宝石的数量和规定的处理次数。

第二行包含n个整数a1,a2,a3,...,an,表示每个宝石的价值。

输出格式:

对于每组数据,输入一个整数,表示在规定的次数内,最大化宝石的总价值。

参考答案:

import math
t = int(input())
for i in range(t):
    n,k = map(int,input().split())
    li = list(map(int,input().split()))
    li.sort()
    pex = [0]
    for i in range(n):
        pex.append(pex[-1] + li[i])
    ans = -math.inf
    for i in range(k + 1):
        ans = max(ans,pex[n - (k - i)] - pex[2 * i])
    print(ans)

运行结果:

 

以下是我对此题的理解:

1.输入

第一行输入一个整数t,表示数据组数

对于每组数据,第一行输入两个整数n和k,分别表示宝石的数量和规定的处理次数。

第二行输入n个整数,表示每个宝石的价值

2.数据处理

程序进入一个循环,循环t次,处理每组数据

对于每组数据,首先将宝石价值列表li进行排序,从小到大排序

3.计算累积和

创建一个列表pex,初始为[0]

然后,对排列后的宝石价值列表进行循环,计算累积和,并将结果存储在pex中

这样,pex中的第i个元素表示前i个宝石的总价值。

4.计算最大总价值

初始化ans为负无穷,表示初始时宝石总价值为最小值

对于处理次数k的所以可能值,从0到k,进行循环

计算当前处理次数下,剩余宝石的最大总价值

使用max函数更新ans,保留最大的总价值

5.输出结果

输出ans,即最大化宝石总价值的结果。

这道题使用了贪心算法的思想,在每次处理中选择了当前最优的方案,以求得最终的最优解。


OK,今天去做别的事情了,所以我只做了两个题,进度有点慢,明天得快一点。

下一篇继续!

 

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

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

相关文章

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看,self attention如何解决问题的?W^q^ W^k^ W^v^这三个矩阵怎么获…

安装使用zookeeper

先去官网下载zookeeper:Apache ZooKeeper 直接进入bin目录,使用powerShell打开。 输入: ./zkServer.cmd 命令,启动zookeeper。 zookeeper一般需要配合Dubbo一起使用,作为注册中心使用,可以参考另一篇博客&#xf…

从零开始掌握Docek的基础知识与应用技巧

目录 前言 一.docekr简介 二.docker的环境搭建 查看内核 更新yum源为最新 ​编辑 安装Docker所需要的工具包 设置yum源 下载docker ​编辑 启动Docker并且设置开机自启动 配置镜像仓库 三.docker命令 1.基本命令 2.常用命令 3.docker容器常用命令 Docker创建并启动…

Java中使用Graphics2D实现图片添加文字/图片水印

场景 java实现给图片添加水印实现步骤: 获取原图片对象信息(本地图片或网络图片) 添加水印(设置水印颜色、字体、坐标等) 处理输出目标图片。 注: 博客:霸道流氓气质-CSDN博客 实现 1、…

Parquet 文件生成和读取

文章目录 一、什么是 Parquet二、实现 Java 读写 Parquet 的流程方式一:遇到的坑:坑1:ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge坑2:No FileSystem for scheme "file"坑3:与 spa…

020—pandas 根据历史高考分段推断当前位次的分数

前言 每年各省都会公布高考「一分一段」表,它是是以「一分」为单位,统计考得该分数的考生人数和累计人数,每一个分数段上有多少人一目了然。考生通过分数分布表可以查询到相关成绩在全市的排名位次,方便对自己进行定位。本例中&a…

嵌入式学习 Day 25

1.线程分离属性: 线程结束后,自动回收线程空间 pthread_attr_init int pthread_attr_init(pthread_attr_t *attr); 功能: 线程属性初始化 pthread_attr_destroy int pthread_attr_destroy(pthread_attr_t *attr); 功能: 线程属性销毁 pthread_attr…

计算机网络实验一 ENSP模拟器使用

实验一 eNSP模拟器的使用 学习目标: 1)掌握eNSP模拟器的基本设置方法 2)掌握使用eNSP搭建简单的端到端(主机)网络的方法 3)掌握在eNSP中使用wireshark捕获IP报文的方法 4)掌握设备的基本配置方…

内网穿透的应用-如何在群晖配置WebDAV实现云同步Zotero科研文献与笔记【内网穿透】

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…

C++基础知识(四:类的学习)

类 类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。 【1】定义 class 类名 { 访问权限:成员属性; 访问权限:成员方法; }访问权限: public:共有的,类内、类外和子类中都可以访问 private:私有…

运维的利器–监控–zabbix–grafana

运维的利器–监控–zabbix–grafana 一、介绍 Grafana 是一个跨平台的开源的度量分析和可视化工具 , 可以通过将采集的数据查询然后可视化的展示 。zabbix可以作为数据源,为grafana提供数据,然后grafana将数据以图表或者其他形式展示出来。zabbix和gra…

AI:142-开发一种智能家居系统,通过语音识别和情感分析实现智能互动

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

【c++】 STL的组件简介与容器的使用时机

STL六大组件简介 STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。 容器:各种数据结构,如vector、list、deque、set、map等,用来存放…

(十八)devops持续集成开发——使用docker安装部署jenkins服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins,选择一个最新稳定版本,避免一些插件不兼…

AI赚钱套路总结和教程

最近李一舟和Sora 很火,作为第一批使用Sora赚钱的男人,一个清华学美术的跟人讲AI,信的人太多了,钱太好赚了。3年时间,李一舟仅通过卖课就赚了1.75亿元,其中《每个人的人工智能课》收入2786万元,…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年,由Boyce和Chamberlin提出 1975~1979,IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

将python两个版本添加环境变量(Mac版)

在运行程序的时候,可能不知道选择哪个版本的程序来执行,先添加环境变量,然后进行选择。 1、查看python安装路径 which python which python3 来查看各个版本的安装位置 2、编辑环境变量配置文件 Macos使用默认终端的shell是bash&#xff0c…

leetcode 2.合并两个有序链表

1..题目:合并两个有序链表; 2.用例: 3.解题思路: (1)函数头:参数是两个链表;返回值为 链表指针 ListNode*; (2)函数体: 1.首先比较…

第十四天-redis操作

目录 1.安装 2.创建链接 1.创建链接 2.连接池链接 3.操作指令 1.字符串操作 set/get 2.expire 3.delete 4.mset/mget 5.list列表操作 6.set集合操作: 7.hash的操作 8.事务 1.安装 1. 安装redis-py模块:: pip install redis 2.参…

一文带你了解MySQL之B+树索引的原理

前言 学完前面我们讲解了InnoDB数据页的7个组成部分,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查…