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。我們需要通過計算來找到最佳的買入和賣出時機,使得收益最大化。
代碼如下:
# 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 = mfor 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) #打印輸出sdef main():tem_arr = list(map(int, input().split())) #使用input()函數接收輸入的數據,并以空格為分隔符將輸入的兩個數字保存到tem_arr列表中。n = tem_arr[0] #將tem_arr中的第一個數字賦值給變量nm = tem_arr[1] #將第二個數字賦值給變量mplist = 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秒才能救出公主。
🔔 解題思路:
代碼如下:
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 += 2if gates[i] > gates[i - 1]:res += 1# 如果王子在公主所在位置,額外增加一秒,但只有在公主所在閘門是關閉的時候才需要增加
if gates[n] > gates[n - 1] or gates[n] == 0:res += 1print(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位。
代碼如下:
class Solution:def solution(self, n, arr): #方法solution接收兩個參數,分別是整數n和一個列表arrresult = NonePI = 3.141592653589793 #定義了一個常量PI,表示π的值arr.sort(reverse=True) #將輸入的數組arr按照降序排列,然后初始化結果變量result為0。result = 0for 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 #返回結果resultif __name__ == "__main__":n = int(input().strip()) #首先讀取輸入的整數narr = [int(item) for item in input().strip().split()] #讀取輸入的列表arr,將其轉換為整數類型,并將0追加到列表末尾arr.append(0) # arr變成n+1項sol = Solution() #創建Solution類的實例solresult = sol.solution(n, arr) #傳入n和arr作為參數,并將返回的結果賦值給變量result。print('%.3f' % result) # 保留3位,不去除末位0