luoguP1080 國王遊戲 (貪心 高精度)

2022-08-21 20:09:12 字數 1338 閱讀 7868

參考:

思路:這道題的考點是貪心和高精度。

貪心部分:

…(設這一段乘積為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 #include3

using

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 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的...