傳送門
考慮任意乙個排隊方案,對於其中某兩個相鄰位置 $i>0,j=i+1$,如果交換更優
那麼有 $max(a/r[i],al[i]/r[j])>max(a/r[j],al[j]/r[i])$,其中 $a=\prod_^l[k]$,$l[0]$ 是國王左手的數
因為 $a/r[i]<=al[j]/r[i]$,$a/r[j]<=al[i]/r[j]$,分類討論一波發現上式等價於 $al[i]/r[j]>al[j]/r[i]$
得到 $l[i]r[i]>l[j]r[j]$ 時,交換最優,所以直接按 $l*r$ 為關鍵字排序即可
如果不太理解 $max$ 是怎麼沒的,直接按 $max(1/r[i],l[i]/r[j])>max(1/r[j],l[j]/r[i])$ 排序也行
計算答案時要用高精度,重新學了一遍壓位高精
#include#include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const ll wid=100000000
;const
int n=2e5+7
;char
ch[n];
struct
bigint
inline
void
read()
a[t]+=k*(ch[i]^48); k*=10
; }
}inline
void
print()
printf(
"%lld
",a[len]);
for(int i=len-1;i;i--) printf("
%08lld
",a[i]);
printf("\n
");}
inline
bool
operator
< (const bigint &tmp) const
inline
bool
operator == (const bigint &tmp) const
inline bigint
operator - (const bigint &tmp) const
while(!u.a[u.len]&&u.len>1) u.len--;
return
u; }
inline bigint
operator + (const bigint &tmp) const
while(x) u.a[++u.len]=x%wid,x/=wid;
return
u; }
inline bigint
operator * (const bigint &tmp) const
inline bigint
operator / (const
int &tmp) const
while(!u.a[u.len]&&u.len>1) u.len--;
return
u; }
}a,b,c,ans;
intn;
struct
dat}d[n];
intmain()
ans.print();
return0;
}
P1080 國王遊戲
題目描述 恰逢 h h國國慶,國王邀請 nn 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 nn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前...
P1080 國王遊戲
恰逢 hh h國國慶,國王邀請n nn 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 nnn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的...
P1080 國王遊戲
恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...