NOIP2012 國王遊戲

2021-07-24 06:33:08 字數 1196 閱讀 2562

【題解】

一開始看著題覺得是二分答案(最大值的最小值),後來發現不滿足單調性

再後來發現可以用貪心做:只需把大臣按照左手*右手公升序排序即可

證明:很顯然前面的大臣位置隨便調換對後面的大臣並沒有影響

那麼假設現在已經排了i-1個大臣,p=a[1]*a[2]*a[3]*……*a[i-1];

第i個大臣的錢w[i]=p/b[i],第i+1個大臣的錢w[i+1]=p*a[i]/b[i+1]

若i+1大臣在i大臣前面

第i個大臣的錢w[i]=p*a[i+1]/b[i],第i+1個大臣的錢w[i+1]=p/b[i+1]

顯然p*a[i+1]/b[i]>p/b[i]  &&  p*a[i]/b[i+1]>p/b[i+1]

所以兩個裡面的最大值在p*a[i+1]/b[i] 和 p*a[i]/b[i+1] 之間  

若p*a[i+1]/b[i] > p*a[i]/b[i+1](這樣就是i+1大臣排在i後面最大值會更小) 則 a[i+1]*b[i+1]>a[i]*b[i]

所以如果要讓大臣得到的錢的最大值最小就要保證兩個相鄰的大臣,前面的左手*右手《後面的左手*右手

(一年前打的題目,現在寫題解還要寫好久,果然我還是太菜了)

詳見**(記得打高精度,還有interesting的高精除法噢233)

#include #include #include #include #include #include #include #include #include using namespace std;

struct info

num[1001];

inline bool cmp(const info &a,const info &b)

t=0;

for (int i=f[0];i>=1;i--)

for (;f[f[0]]==0 && f[0]>0;f[0]--);

if (f[f[0]]==0) printf("1");else printf("%d",f[f[0]]);

for (int i=f[0]-1;i>=1;i--)

}

noip2012國王遊戲

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

NOIP2012國王遊戲

用貪心可以解決。將所有人按左右手的乘積排序,這樣一定可以保證結果最優。現給出證明 首先,任意相鄰兩人的順序對於排在他們前面和後面的人沒有影響。顯然 兩人左右手上的數字分別為l 1 r 1 l 2 r 2 令l 1 r 1 若1在2前面,那麼兩人分得的金幣分別為sum r 1 sum l 1 r 2 ...

noip2012 國王遊戲

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