用貪心可以解決。
將所有人按左右手的乘積排序,這樣一定可以保證結果最優。
現給出證明:
首先,任意相鄰兩人的順序對於排在他們前面和後面的人沒有影響。(顯然)
兩人左右手上的數字分別為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 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所...