P1080 国王游戏(贪心)
題意:
有一個國王的左右手上分別寫了a0,b0,他把他的n個臣子叫過來,左右手分分別寫上ai,bi,每個臣子能獲得的獎勵是所有站在他前面的人a[i]的乘積除以這個臣子右手上的數字(國王始終站在第一個),國王想讓臣子獲得金幣的最大值最小,問你國王該怎么安排這個隊列?輸出這個最小值。
思路:
假設有兩個臣子一個國王,兩個臣子分別為a1,b1,a2,b2,我們有兩種排列方式,ans1=max(a0/b1, a0 * a1 / b2),ans2=max(a0/b2. a0 * a2 / b1), 我們簡化一下,ans1=max(k1,k2),ans2=max(k3,k4),顯然k1<k4,k2>k3。假設這時候滿足ans1<ans2,即最大值應該在k3,k4中取,因為k2>k3,所以一定有k4>k2,帶入式子,得a1b1<a2b2,所以我們只需要把n個人的ai*bi從小到大排序即可計算答案。
Python知識:
1、strip()方法
strip() 方法用于移除字符串頭尾指定的字符(默認為空格)。
2.sort是list類的一個方法,只能與list一起使用。它不是一個內置的迭代器。
L.sort(cmp=None, key=None, reverse=False)
cmp:用于比較的函數,比較什么由key決定,有默認值,迭代集合中的一項;
key:用列表元素的某個屬性和函數進行作為關鍵字,有默認值,迭代集合中的一項;
reverse:排序規則. reverse = True 或者 reverse = False,有默認值。
3.lambda函數作為參數傳遞給其他函數。
如:sorted與sort函數。此時lambda函數用于指定對列表中所有元素進行排序的準則。
AC代碼:
n = int(input()) #去掉字符串后面的空格,并將字符以空格分割 a,b = input().strip().split() #將字符轉化為數字 a,b = int(a),int(b) #創建一個空列表 arr = list()for i in range(0,n):#c為兩個數字字符組成的列表c = input().strip().split()for j in range (0,len(c)):c[j] = int(c[j]) #轉化為數字形式arr.append(c) #向列表中加入該列表,因此arr相當于一個二維數組arr.sort(key = lambda x:x[0]*x[1])tot =a res = tot //arr[0][1] //先記錄下如果只有一個人的情況 tot *= arr[0][0]for i in range (1,len(arr)):res = max(res,tot//arr[i][1]) //找最大的,因為不一定是最后一個大tot *= arr[i][0]print(res)總結
以上是生活随笔為你收集整理的P1080 国王游戏(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces 1153 C Se
- 下一篇: Codeforces 797C Mini