CSDN编程题-每日一练(2023-08-14)
一、题目名称:小股炒股
时间限制:1000ms内存限制:256M
题目描述:
已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益是?
输入描述:
第一行输入整数n,m。(1<=n<=1000,1<=m<=10000) 第二行输入n个整数表示某股票单股价格p。(1<=p<=1000)
输出描述:
输出小最大收益
🚩 示例:
✔️ 示例1 :
输入
2 4
3 7
输出
8
🔔 解题思路:
这道题目是要计算在n天后的股票行情中,通过一次买入和一次卖出能够获得的最大收益。题目中给出了n天后的股票价格列表和初始本金m。我们需要通过计算来找到最佳的买入和卖出时机,使得收益最大化。
代码如下:
python
# max(a, b)函数用于比较两个数 a 和 b,返回较大的那个数,使用了三元条件表达式。
def max(a, b):
return a if a > b else b
#count(m, a, b)函数用于计算一次交易后的利润,给定参数 m(本金)、a(买入价格)、和 b(卖出价格)。它计算可以用初始资金 m 购买的最大单位数 n,然后计算购买了 n 个单位后的剩余资金。函数返回出售购买的单位后得到的总资金。
def count(m, a, b):
n = m // a #计算用来表示投资收益的比例或指标,它表示的是投入的本金与购买价格之间的比值。这个比值可以用来评估投资的效果,以及在卖出资产后,本金相对于初始购买价格的增长或减少情况。
return m - n * a + b * n #计算交易总资金
#
def solution(n, m, plist):
p = plist[0] #初始化变量p为列表plist的第一个元素,并将变量s赋值为m。
s = m
for i in range(1, n): #通过循环遍历列表plist的剩余元素。如果当前元素大于p,说明可以卖出并获得更高的利润,调用count函数计算利润,并将结果与s进行比较,取较大值。如果当前元素小于等于p,说明无法获得更高的利润,更新p为当前元素。
if plist[i] > p:
t = count(m, p, plist[i])
s = max(t, s)
else:
p = plist[i]
print(s) #打印输出s
def main():
tem_arr = list(map(int, input().split())) #使用input()函数接收输入的数据,并以空格为分隔符将输入的两个数字保存到tem_arr列表中。
n = tem_arr[0] #将tem_arr中的第一个数字赋值给变量n
m = tem_arr[1] #将第二个数字赋值给变量m
plist = list(map(int, input().split())) #使用input()函数接收输入的数据,并以空格为分隔符将输入的数字保存到plist列表中
solution(n, m, plist) # 调用solution函数,传入n、m和plist作为参数
if __name__ == "__main__":
main()
二、题目名称:王子闯闸门
时间限制:1000ms内存限制:256M
题目描述:
波斯王子要去救被贾法尔囚禁的公主,但贾法尔用黑魔法在他面前设置了编号从1到n的n道闸门。从王子的位置到1号闸门需要1秒,从n号闸门到公主所在的位置也需要1秒,从p号闸门到p+1或p-1号闸门都需要1秒。
每过1秒钟,王子都必须决定选择前进一道闸门、后退一道闸门或停在原地这三种动作中的一种。当然,王子不能选择移动到关闭状态的闸门而只能选择开启状态的闸门。在王子做出动作选择后,闸门也可能会有关闭和开启的动作,如果王子做完动作后,其所在的闸门在该秒内的动作是从开启变为关闭则他就会被闸门夹死。
现在给出闸门数量n和m个闸门的动作时刻表,求波斯王子需要多少秒才能救出公主。
输入描述:
第一行给出n和m,接下来的m行每行代表一个闸门关闭的时段,包含三个数字a、b、c代表编号为a的闸门会在第b秒到第c秒之间关闭,其他时间开启。可能会给出同一编号闸门的多个关闭时段,但这些时段不会相交,即如果给出的数字是a、p、q和a、x、y则不可能p<x<q或x<p<y。
输出描述:
波斯王子救出公主所需要的秒数t(t>0)。
🚩示例:
✔️示例1
输入样例:
2 2
1 2 3
2 1 2
输出样例:
6
输入示例解释:有2道闸门(编号从1到2)。
第1道闸门会在第2秒到第3秒之间关闭,其他时间开启。
第2道闸门会在第1秒到第2秒之间关闭,其他时间开启。
输出示例解释:
波斯王子需要按照以下步骤来救出公主:
移动到1号闸门:1秒
移动到2号闸门:1秒
移动到1号闸门:1秒
移动到2号闸门:1秒
移动到1号闸门:1秒
移动到2号闸门:1秒
所以,总共需要6秒才能救出公主。
🔔 解题思路:
代码如下:
python
n, m = map(int, input().split())
gates = [0] * (n + 2)
for _ in range(m):
a, b, c = map(int, input().split())
gates[a] = max(gates[a], c)
res = 0
for i in range(1, n + 1):
res += 2
if gates[i] > gates[i - 1]:
res += 1
# 如果王子在公主所在位置,额外增加一秒,但只有在公主所在闸门是关闭的时候才需要增加
if gates[n] > gates[n - 1] or gates[n] == 0:
res += 1
print(res)
三、题目名称:圆小艺
时间限制:1000ms内存限制:256M
题目描述:
最近小艺酱渐渐变成了一个圆滑的形状-球!! 小艺酱开始变得喜欢上球! 小艺酱得到n个同心圆。 小艺酱对着n个同心圆进行染色。 相邻的圆范围内不能有相同的颜色。相隔一层的圆颜色相同。 小艺酱想知道两种颜色最大中最外层圆的那种颜色染了多少?
输入描述:
第一行输入整数n.(1<=n<=1000)表示圆的数量。 第二行输入n个圆的半径。(1<=r<=1000)
输出描述:
输出染色面积,保留小数点后3位。
🚩示例:
✔️示例1
输入
3
1 2 3
输出
18.849
🔔 解题思路:
1、根据输入的n和n个圆的半径,计算出每个圆的面积。
2、按照题目描述的染色规则,计算出两种颜色最外层圆的面积。
3、输出结果,保留小数点后3位。
代码如下:
python
class Solution:
def solution(self, n, arr): #方法solution接收两个参数,分别是整数n和一个列表arr
result = None
PI = 3.141592653589793 #定义了一个常量PI,表示π的值
arr.sort(reverse=True) #将输入的数组arr按照降序排列,然后初始化结果变量result为0。
result = 0
for i in range(0, n, 2): #使用循环遍历数组arr中的元素,步长为2。在每次循环中,计算当前元素和下一个元素所对应的圆的面积差,并将其累加到结果result中。
result += (PI * arr[i] * arr[i] - PI * arr[i + 1] * arr[i + 1]) #在每次循环中,计算当前元素和下一个元素所对应的圆的面积差,并将其累加到结果result中。具体计算方法为:使用PI乘以当前元素的平方减去PI乘以下一个元素的平方。
return result #返回结果result
if __name__ == "__main__":
n = int(input().strip()) #首先读取输入的整数n
arr = [int(item) for item in input().strip().split()] #读取输入的列表arr,将其转换为整数类型,并将0追加到列表末尾
arr.append(0) # arr变成n+1项
sol = Solution() #创建Solution类的实例sol
result = sol.solution(n, arr) #传入n和arr作为参数,并将返回的结果赋值给变量result。
print('%.3f' % result) # 保留3位,不去除末位0