恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。
首先,他讓每個大臣在左、右手上面分別寫下乙個整數,國王自己也在左、右手上各寫乙個整數。
然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。
排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是:
排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。
國王不希望某乙個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。
注意,國王的位置始終在隊伍的最前面。
輸出只有一行,包含乙個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。
1≤n≤1000
0用區域性最優推出整體最優。因為要重新排序,所以可以看作是按照某種原則的氣泡排序,那我們只需要比較相鄰兩人的金幣數就可以了。
懶就貼圖了
得出我們只需要按l*r從小到大排序就行,然後考慮極限情況10000
1000^10
0001
000(其實也沒那麼大,但還是盡量開大點),所以需要大數的乘法和除法。
這裡是重寫了結構體的乘號、除號、小於號。
具體實現見**
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using
namespace std;
struct stu
t[1100];
struct bigint
bigint
(int t)
} bigint operator*(
const
int&b)
const
for(
int i=
0;i)while
(t.a[t.len]
>0)
return t;
} bigint operator/(
const
int&b)
const
while
(!t.a[t.len-1]
&&t.len>1)
return t;
}bool
operator
<
(const bigint &b)
const
return
false;}
else
return len
;bool
cmp(stu a,stu b)
intmain()
sort
(t+1
,t+n+
1,cmp)
; bigint ans,now,x=1;
for(
int i=
1;i1;i++
)// cout
(t[i]
.r==0)
break
; now=x/t[i]
.r;// for(int i=now.len-1;i>=0;i--)
// cout/ cout
(ans
ans=now;
}for
(int i=ans.len-
1;i>=
0;i--
)return0;
}
ACWing 114 國王遊戲
恰逢某國國慶,國王邀請n nn位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這n nn位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...
AcWing 114 高精度運算)
恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...
114 國王遊戲
除第乙個人以外的每個人能獲得的獎賞為他之前所有人的左手乘積除以自己右手上的值 注意是之前的所有人不包括自己 通過改變順序使得獲得最多獎賞最小化。貪心策略 受到奶牛的雜技這題的影響,我們發現乘積越大的要往後放除的大的也要往後放,所以我們根據左手右手的乘積從小到大排序,然後以此計算取max即可,交了之後...