NOIP2012國王遊戲

2021-07-24 09:06:21 字數 1270 閱讀 7893

用貪心可以解決。

將所有人按左右手的乘積排序,這樣一定可以保證結果最優。

現給出證明:

首先,任意相鄰兩人的順序對於排在他們前面和後面的人沒有影響。(顯然)

兩人左右手上的數字分別為l[1],r[1],l[2],r[2],令l[1]*r[1]

若1在2前面,那麼兩人分得的金幣分別為sum/r[1],sum*l[1]/r[2]。

若2在1前面,兩人分得的金幣分別為sum/r[2],sum*l[2]/r[1]。

現比較max(sum/r[1],sum*l[1]/r[2])和max(sum/r[2],sum*l[2]/r[1])的大小:

因為l[1]*r[1]

而sum*l[2]/r[1]>sum/r[1]顯然成立且sum*l[2]/r[1]>sum*l[1]/r[2]也成立(因為l[1]*r[1]

故max(sum/r[1],sum*l[1]/r[2])

故1在2前面兩人分得的金幣的最大值最小。

以此類推,左右手乘積較大的放在後面結果會更優。證畢。

由於此題資料較大,需要用到高精度乘法和除法。

**:#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

struct nodec[100010];

long long a[100010],b[100010];

int n;

bool cmp(node a,node b)

}return 0;

}string milt(string s,long long t)

; long long u[10001]=;

for(int i=0;i=10)ans[i+1]=ans[i]/10;

ans[i]%=10;

}string e;

int v=s.size()+16;

while(v>1&&ans[v]==0)v--;

for(int i=v;i>=1;i--)e+=(ans[i]+'0');

return e;

}string chu(string s,long long t)

sort(c+1,c+n+1,cmp);

string sum="1";

string tot="0";

for(int i=0;i<=n;i++)

cout<

noip2012國王遊戲

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

NOIP2012 國王遊戲

題解 一開始看著題覺得是二分答案 最大值的最小值 後來發現不滿足單調性 再後來發現可以用貪心做 只需把大臣按照左手 右手公升序排序即可 證明 很顯然前面的大臣位置隨便調換對後面的大臣並沒有影響 那麼假設現在已經排了i 1個大臣,p a 1 a 2 a 3 a i 1 第i個大臣的錢w i p b i...

noip2012 國王遊戲

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