【二中OJ】1274 【p-QZ-2016-1】狐狸尼克的实验

文章介绍了如何通过编程解决一个化学物质排列问题,要求在满足安全距离的同时找到桌子的最短长度。给出了代码示例,包括输入格式的理解和核心逻辑的实现,涉及Python中的`max()`函数和循环结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二中OJ网址传送门(点击跳转)

由于网站设计原因,无法直接跳转题目,需要自己点击【所有试题】——【试题ID】——输入本题题号并点击【开始查询】

文字题解看不懂?试试视频题解 (内容暂无,敬请期待)

题面大意

  • 两个化学品之间的距离不能小于这两个化学品中任意一个的安全距离
  • N 个化学物质必须按照题目给出的顺序以一条直线的形式依次摆放在桌面上
  • 要求整个桌子最短的长度

思路分析

  • 两个化学品既要保证安全,又要长度最短,即两个化学品之间的距离=两个化学品所需安全距离中较大的那一个值
  • 将实际情景抽象化为:输入一组数,求出每两个数中的较大值的总和

代码实现

  1. 看输入格式:“第 1 行一个整数 N ,表示化学物质的个数;第 2 行有 N 个整数,第 i 个整数 Ai,表示第 i 个化学物质必须与其它化学物质保持的距离。”
n=int(input()) #第一行读入一个整数n
a=list(map(int,input().split())) #第二行读入一个列表,列表有n个整数,分别代表n个化学物质的安全距离

input()表示读入一个字符串.split()表示以空格为分割,将该字符串分为多个
map(int,input().split())意为强制将分割出来的多个字符串转化为整数类型
list()意为强制将这些变量转化为列表,一个列表中存储这些整数(顺序为原输入顺序)

所以连在一起就是读入一行以空格为分割的整数,将它们存在一个列表里

  1. 核心代码为依次循环遍历列表中每一个元素,得出这个元素与前一个元素中的较大值,并进行累加
for i in range(1,len(a)):
    maxn=max(a[i],a[i-1])
    sum1+=maxn

这里我处理了一个细节range(1,len(a)),首先len(a)取不到大家应该已经比较熟悉了,但是为什么我开头从 1 1 1开始,而不是从 0 0 0开始呢?因为我在我的循环代码里使用了a[i-1],如果从 0 0 0开始,a[-1]代表的是列表中的最后一个元素,显然不符合我的初衷,所以我从 1 1 1开始遍历,避免越界(越界是编程中的专业术语,意为使用了超过列表长度的索引,即超出了某种范围)

当然了,下面这样也可以(range 0 0 0遍历到len(a)-1),这样的方法就要考虑尾部的越界问题,所以我们range的终点写了len(a)-1避免越界

for i in range(len(a)-1):
    maxn=max(a[i],a[i+1])
    sum1+=maxn

其次就是函数max(),这个函数是系统内置函数,max(a,b)的值 = = =a变量和b变量中的较大值,用起来相当方便顺手(特别提醒:max的括号中可以写多个变量

  1. 最后看输出格式,要求输出桌子的最小长度,所以我们输出sum1这个变量就可以了

最终代码

n=int(input())

a=list(map(int,input().split()))

sum1=0
for i in range(1,n): # 这个地方终点写n或者len(a)都可以,表示的内容含义相同,值也相同
    maxn=max(a[i-1],a[i])
    sum1+=maxn

print(sum1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值