NOIP2012提高組Day1T2 國王遊戲

2021-09-30 16:59:01 字數 2900 閱讀 5790

國王遊戲

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

國王不希望某乙個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。注意,國王的位置始終在隊伍的最前面。

輸入第一行包含乙個整數 n,表示大臣的人數。

第二行包含兩個整數 a和 b,之間用乙個空格隔開,分別表示國王左手和右手上的整數。

接下來 n 行,每行包含兩個整數 a 和 b,之間用乙個空格隔開,分別表示每個大臣左手和右手上的整數。

輸出輸出只有一行,包含乙個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數

樣例輸入

31 1

2 37 4

4 6樣例輸出

2【輸入輸出樣例說明】

按 1、2、3 號大臣這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 1、3、2 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 2、1、3 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 2、3、1 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 9;

按 3、1、2 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2;

按 3、2、1 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 9。

因此,獎賞最多的大臣最少獲得 2 個金幣,答案輸出 2。

【資料範圍】

對於 20%的資料,有 1≤ n≤ 10,0 < a、b < 8;

對於 40%的資料,有 1≤ n≤20,0 < a、b < 8;

對於 60%的資料,有 1≤ n≤100;

對於 60%的資料,保證答案不超過 10^9;

對於 100%的資料,有 1 ≤ n ≤1,000,0 < a、b < 10000。

analysis

啊啊。高精度又寫炸了,我可能和它不熟,要多練啊!!萬一noip考到了呢??

其實這道題不算難,結論也很好推

就是根據資料範圍發現連乘起來只能用高精度

貪心策略+交換相鄰法

如果現在有兩個大臣i,j

i,ji,

j,什麼時候 i 排在 j 前面會使答案更優?

令 1 到i

−1

1到i-1

1到i−

1的大臣(包括king)的左手的數字連乘起來為xxxc

ici

ci表示第 i 個大臣能拿到的金幣數

則當i排在前面的時候ci=

xb

ici=\frac

ci=bi​

x​c j=

x∗ai

bj

cj=\frac

cj=bj​

x∗ai

​​j排在前面的時候 ci=

x∗aj

bi

ci=\frac

ci=bi​

x∗aj

​​c j=

x∗bj

cj=\frac

cj=bj​

x∗​取一下max,再比較一下,就會發現

當a i∗

bi

∗b

ja_i*b_iai

​∗bi

​​∗bj

​的時候,i 在前面會更優

然後就排個序,高精度瞎搞一下

code

#include

#define in read()

#define n 50009

#define ll long long

using

namespace std;

inline

intread()

return f==

1?res:

-res;

}int n;

struct nodep[n]

;inline

bool

cmp(

const node &x,

const node &y)

struct big

big(ll a)

big operator

=(ll x)

return

*this;}

big operator

*(big y)

}int

&l=c.len;

while

(c.a[l+1]

)++l,c.a[l+1]

+=c.a[l]/10

,c.a[l]%=

10;//仍然要考慮進製u

return c;

} big operator/(

int y)

int&l=res.len;

while

(!res.a[l]

&&l) l--

;return res;

}}mx,mul;

big max

(big x,big y)

return x;

}int

main()

sort

(p+1

,p+n+

1,cmp)

; mx=

0;mul=p[0]

.a;for

(int i=

1;i<=n;

++i)

for(

int i=mx.len;i>=1;

--i) cout<;return0;

}

NOIP2012 提高組 day1 國王遊戲

題解這道題是一道貪心題,大家只需要找到貪心策略是左手與右手的乘積,然後從小到大sort一下就ok了 不過大家有一點需要小小注意一下,需要打乙個高精度,要不然就只有60了 include define maxn 10005 using namespace std int a 10005 n,len,x...

NOIP2012 提高組 day1 國王遊戲

由公式推導出 當大臣按照 a b由小到大排列時,會使得答案取到最小,算出每個人的金幣數比較即可 要用高精度乘法和除法,否則只有60分。include h using namespace std typedef long long ll const int n 10050,m 4005 struct ...

NOIP2012提高組 借教室

這個題目是個一眼題啊,維護一下一段區間內教室數的最小值,線段樹搞就可以了,lazy標記打一打,來乙個訂單先詢問再區間減,codevs上是可以過的,只不過嘛。debug大神。include include include include includeconst int maxn 1e6,maxnod...