二中OJ网址传送门(点击跳转)
由于网站设计原因,无法直接跳转题目,需要自己点击【所有试题】——【试题ID】——输入本题题号并点击【开始查询】
文字题解看不懂?试试视频题解 (内容暂无,敬请期待)
题面大意
- 两个化学品之间的距离不能小于这两个化学品中任意一个的安全距离
- N 个化学物质必须按照题目给出的顺序以一条直线的形式依次摆放在桌面上
- 要求整个桌子最短的长度
思路分析
- 两个化学品既要保证安全,又要长度最短,即两个化学品之间的距离=两个化学品所需安全距离中较大的那一个值
- 将实际情景抽象化为:输入一组数,求出每两个数中的较大值的总和
代码实现
- 看输入格式:“第 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()
意为强制将这些变量转化为列表,一个列表中存储这些整数(顺序为原输入顺序)
所以连在一起就是读入一行以空格为分割的整数,将它们存在一个列表里
- 核心代码为依次循环遍历列表中每一个元素,得出这个元素与前一个元素中的较大值,并进行累加
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的括号中可以写多个变量)
- 最后看输出格式,要求输出桌子的最小长度,所以我们输出
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)