參考:
思路:這道題的考點是貪心和高精度。
貪心部分:
…(設這一段乘積為x1)
…(設這一段乘積為y2)
l1r1
…(設這一段乘積為x2)
…(設這一段乘積為y2)
l2r2
由上面這張**可以知道這樣的情況時:
第一個人所得的金幣數為x1/r1;
第二個人所得的金幣數為x1×l1×x2/r2;
所以最小值為 max(x1/r1, x1×l1×x2/r2);
然後交換兩個人的位置
…(這一段乘積為x1)
…(這一段乘積為y2)
l2r2
…(這一段乘積為x2)
…(這一段乘積為y2)
l1r1
由上面這張**可以知道交換後的情況時:
第一個人所得的金幣數為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恆成立。
綜上,很容易想到li×ri越大的應該排在越後面,所以對資料排個序就行。
另外就是高精度,資料最大可能達到10的4000次方,故需要使用高精度,這種高精度方法是參考的別人的,比較方便巧妙,不需要花費時間進行整數與字串的轉化。
**如下:
1 #include2 #include3using
namespace
std;45
struct
node
10 }dat[1005
];11
12int n,in=1;13
int hp[4005
];14
15void mul(int
k)22
in++;
23while(hp[in]>9)28
if(hp[in]==0)29
in--;30}
3132
void
div()
37while(hp[in]==0)38
in--;39}
4041
intmain()
P1080 國王遊戲
題目描述 恰逢 h h國國慶,國王邀請 nn 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 nn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前...
洛谷 1080 國王遊戲
題目描述 恰逢 h h國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的...
P1080 國王遊戲
恰逢 hh h國國慶,國王邀請n nn 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 nnn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的...