原題
題解
這個國王太會玩了!!
【題意分析】
首先,由於乙個大臣所獲得的金幣數隻取決於他右手的金幣數,所以前面的大臣順序並不影響後面大臣的金幣數,但會影響自己手中的金幣數。然後便想到了貪心。但發現這樣子並不能得出最優解。然後經過一番推導,便可以得知乙個大臣的左右手乘積越大,就越要放到隊伍後面。
然後就開始了玄妙的數學證明時間!!
前方高能!!!前方高能
【證明】
…(設這一段乘積為x1) …(設這一段乘積為y2)
l1 r1
…(設這一段乘積為x2) …(設這一段乘積為y2)
l2 r2
由上面這張**可以知道這樣的情況時:
第一個人所得的金幣數為x1/r1;
第二個人所得的金幣數為x1×l1×x2/r2;
所以最小值為 max(x1/r1, x1×l1×x2/r2);
然後交換兩個人的位置
…(這一段乘積為x1) …(這一段乘積為y2)
l2 r2
…(這一段乘積為x2) …(這一段乘積為y2)
l1 r1
由上面這張**可以知道交換後的情況時:
第一個人所得的金幣數為x1×l2×x2/r1;
第二個人所得的金幣數為x1/r2;
所以此時最小值為max(x1×l2×x2/r1, x1/r2);
綜合上面兩種情況:
如果變換之前的情況要優於變換之後的情況,那麼
max(x1/r1, x1×l1×x2/r2) < max(x1×l2×x2/r1, x1/r2);
而x1/r1 < x1×l2×x2/r1 恆成立;
x1×l1×x2/r2 > x1/r2;
所以上述條件成立時
必須有x1×l1×x2/r2 < x1×l2×x2/r1 恆成立;所以化簡可得 l1×r1 < l2×r2恆成立。
int n, lens = 1, lenm = 1, lena = 1;//重要的初始化
int sum[10010] = , maxn[10010] = , ans[10010];//重要的初始化
//ans是高精度除法的儲存陣列,sum是高精度乘法的儲存陣列
struct tmp
}coin[1001];
void muti(long long x)//高精度乘法 求累積
//進製過程
while(tmp != 0)
//增加位數
}void cut(long long x)//高精度除法求每個大臣的獎賞
}while(ans[lena] == 0)//去掉多餘的0
}void max()
else if(lena == lenm)
}}int main()
for(int i = lenm; i >= 1; i--) cout << maxn[i];//高精度要求倒著輸出
}
國王的遊戲(貪心 高精度)
恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...
NYOJ zkc學長的福利 貪心 高精度運算
分析 因為人的排的順序不一樣,最後的結果也不一樣 題上說為讓的到最多肉鬆的人得到的最少,所以很明顯就是貪心,而這道題貪心的目的就是得到乙個最優的排序。這就需要我們找到乙個排序的比較函式。假設對於a,b兩人以前的順序已經排好,現在的問題就是a,b的順序。設前面所有人左手乘積為t 如果a在前,a得到的肉...
帶小數的高精度除法(除以低精度數)
1 2 3code instruction45 coding by kaka ricochet simpson67 greatintcal.8 9 10 define maxl 1000 11 include 12 include 13void intcpy int a,int b 14 void ...