貪心演算法 國王遊戲

2021-08-20 05:32:46 字數 1688 閱讀 1756

孫悟空給花果山的小猴子們分桃子。

首先,他讓每只小猴在左、右手上面分別寫下乙個整數,悟空自己也在左、右手上各寫乙個整數。

然後,讓這 n 隻小猴排成一排,悟空站在隊伍的最前面。

排好隊後,所有的小猴都會獲得一些桃子,每只小猴獲得的桃子數分別是:排在該小猴前面的所有猴子的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。

悟空不希望某乙隻小猴獲得特別多的桃子,所以他想請你幫他重新安排一下隊伍的順序, 使得獲得桃子最多的小猴,所獲桃子盡可能的少。注意,悟空的位置始終在隊伍的最前面。

第一行包含乙個整數 n,表示小猴數。

第二行包含兩個整數 a 和 b,之間用乙個空格隔開,分別表示悟空左手和右手上的整數。

接下來 n 行,每行包含兩個整數 a 和 b,之間用乙個空格隔開,分別表示每個小猴左手和右手上的整數。

包含乙個整數,表示重新排列後的隊伍中獲桃子最多的小猴所獲得的桃子數。

3

1 12 3

7 44 6

2
noip 2012 國王遊戲

這是一道典型的使用貪心演算法來解決的問題

我們知道,對於任意給定的隊伍順序:若是僅交換相鄰的兩隻猴子的話,對於前面的猴子沒有影響(不改變前面的分布),對於後面的猴子也沒有影響(不改變左手的乘積)。因此,也就是說,我們通過討論兩隻相鄰猴子的是否交換,最後推出整隻隊伍的順序,這就是最基礎的思路。

設a1,b1為左手數字; a2,b2為右手數字

設七元組(p,a1,b1,a2,b2,sum,ans),(a1,b1)∈p,(a2,b2)∈p,sum是猴子1和猴子2前所有人左手上數字的乘積,ans是猴子1與猴子2所發錢財的最大值。

若選擇猴子1在前面,則ans=max(sum/b1,sum*a1/b2);

若選擇猴子2在前面,則ans=max(sum/b2,sum*a2/b1).

易知,sum/b1,且sum/b2

∴最優解選擇猴子1在前面,當sum*a1/b2

最優解選擇猴子2在前面,當sum*a2/b1即得到結論:若要想使得到的ans最小,則盡量將左右手乘積小的放前面即可。

上面是對於兩隻相鄰猴子的討論,但實際上已經是對整個隊伍的討論。如果考慮按左右手乘積從小到大排列的排序,對任意乙個無序排列,可經過有限次相鄰的上述排列方法達到該排序,且有上述證明知每一次變換使結果更優(或至少不會更差),則可知按順序由小到大時最優,及最大值最小!

num=int(input())+1

zong=[[0 for i in range(3)] for j in range (num-1)]

zuo,you=map(int,input().split())

cheng=zuo

for i in range (num-1):

zong[i][0],zong[i][1]=map(int,input().split())

zong[i][2]=zong[i][0]*zong[i][1]

xiao=1

for i in range (num-1):

zong.sort(key=lambda x:x[2])

for i in range (num-1):

if xiaoxiao=int(cheng/zong[i][1])

cheng*=zong[i][0]

print(xiao)

總結 貪心演算法 貪心演算法 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...

貪心演算法 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。輸入 3,2,1,0,4 輸出 false 解釋 無論怎...

跳躍遊戲 貪心演算法

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...