P1080 國王遊戲

2022-05-19 09:13:20 字數 1738 閱讀 8655

傳送門

考慮任意乙個排隊方案,對於其中某兩個相鄰位置 $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 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...