ACWing 114 國王遊戲

2021-10-21 02:32:02 字數 3451 閱讀 9730

恰逢某國國慶,國王邀請n

nn位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左、右手上面分別寫下乙個整數,國王自己也在左、右手上各寫乙個整數。然後,讓這n

nn位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。國王不希望某乙個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。注意,國王的位置始終在隊伍的最前面。

輸入格式:

第一行包含乙個整數n

nn,表示大臣的人數。第二行包含兩個整數a

aa和b

bb,之間用乙個空格隔開,分別表示國王左手和右手上的整數。接下來n

nn行,每行包含兩個整數a

aa和b

bb,之間用乙個空格隔開,分別表示每個大臣左手和右手上的整數。

輸出格式:

輸出只有一行,包含乙個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。

資料範圍:

1 ≤n

≤1000

1≤n≤1000

1≤n≤10

000

b<

10000

00b<10

000

按照a ∗b

a*ba∗

b從小到大排序然後列舉即可。

演算法正確性證明:

對於某解,考慮第i

ii個大臣和第i+1

i+1i+

1個大臣,他們獲得的金幣數是(1b

i∏k=

1i−1

ak,1

bi+1

∏k=1

iak)

(\frac\prod_^a_k,\frac}\prod_^a_k)

(bi​1​

∏k=1

i−1​

ak​,

bi+1

​1​∏

k=1i

​ak​

),如果將這兩個人交換位置,那麼獲得的金幣是(1b

i+1∏

k=1i

−1ak

,1bi

ai+1

∏k=1

i−1a

k)

(\frac}\prod_^a_k,\fraca_\prod_^a_k)

(bi+1​

1​∏k

=1i−

1​ak

​,bi

​1​a

i+1​

∏k=1

i−1​

ak​)

。顯然交換這兩個人的話,別的所有人的金幣數都是不變的。我們把同類項去掉,看(1b

i,ai

bi+1

)(\frac,\frac})

(bi​1​

,bi+

1​ai

​​)和(1b

i+1,

ai+1

bi

)(\frac},\frac})

(bi+1​

1​,b

i​ai

+1​​

),再同時乘以bib

i+

1b_ib_

bi​bi+

1​,比較(bi

+1,a

ibi)

(b_,a_ib_i)

(bi+1​

,ai​

bi​)

和( bi

,ai+

1bi+

1)

(b_i,a_b_)

(bi​,a

i+1​

bi+1

​)。如果aib

i≥ai

+1bi

+1

a_ib_i\ge a_b_

ai​bi​

≥ai+

1​bi

+1​,那麼交換之後,max⁡≤

max⁡

\max\b_\}\le \max\,a_ib_i\}

max≤

max,也就是說交換之後結果不會變得更差。所以對於任意乙個最優解,總能把它通過交換使得其是按照aib

ia_ib_i

ai​bi​

從小到大排序的,所以按照aib

ia_ib_i

ai​bi​

從小到大排序的就能得到最優解。排好序後只需要算一下每個大臣有多少金幣,找到拿的金幣最多的那個即可(需要高精度)。**如下:

#include

#include

#include

using

namespace std;

const

int n =

1010

;pair<

int,

int> p[n]

;int n;

vector<

int>

mul(vector<

int> a,

int b)

return c;

}vector<

int>

div(vector<

int> a,

int b)

reverse

(c.begin()

, c.

end())

;if(c.empty()

) c.

push_back(0

);return c;

}vector<

int>

maxv

(vector<

int> a, vector<

int> b)

intmain()

;}sort

(p +

1, p + n +1)

; vector<

int>

res(1,

0); vector<

int>

prod(1

,1);

prod =

mul(prod, p[0]

.first)

;for

(int i =

1; i <= n; i++

)for

(int i = res.

size()

-1; i >=

0; i--

) cout << res[i]

; cout << endl;

return0;

}

時間複雜度o(n

log⁡n+

k)

o(n\log n+k)

o(nlogn+

k),k

kk是高精度需要的時間,最差情況下可能達到n

2n^2

n2,空間o(n

)o(n)

o(n)

AcWing 114 國王遊戲 貪心 大數處理

恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...

AcWing 114 高精度運算)

恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...

114 國王遊戲

除第乙個人以外的每個人能獲得的獎賞為他之前所有人的左手乘積除以自己右手上的值 注意是之前的所有人不包括自己 通過改變順序使得獲得最多獎賞最小化。貪心策略 受到奶牛的雜技這題的影響,我們發現乘積越大的要往後放除的大的也要往後放,所以我們根據左手右手的乘積從小到大排序,然後以此計算取max即可,交了之後...