NOIP 提高組2012 國王遊戲

2022-04-30 05:03:08 字數 1696 閱讀 5160

【題意】

恰逢h國國慶,國王邀請n位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左、右

手上面分別寫下乙個整數,國王自己也在左、右手上各寫乙個整數。然後,讓這n位大臣排

成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每

位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右

手上的數,然後向下取整得到的結果。

國王不希望某乙個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,

使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。注意,國王的位置始終在隊伍的最前面。

【演算法】貪心(排序)+高精度

【題解】這是少數不用二分解決最大值最小化問題的題。

我們考慮將所有大臣按某種條件排序,從而滿足該順序最優。

考慮當前已有排序,其中某兩位置是a1,b1和a2,b2,交換兩個位置不能使答案最優需要滿足的條件。

顯然交換兩位置對前後都沒有影響,假設σai=s,所以交換後不能使答案最優須滿足:

$$max(\frac,\frac)將s提出來,

$$max(\frac,\frac)由於ai是正整數,故我們已知:

$$\frac

所以條件轉化為:

$$\frac

即:$$a_1b_1所以只要按aibi從小到大排序,一定最優。

為了找到適合排序的關鍵字,我們考慮某兩位的交換會使排序更優的條件即可得知。

答案最大可以達到10000^1000即10^4000,要用高精度。(這是noip最後一次考高精度,以後不可能再考了)

#include#include

using

namespace

std;

const

int maxn=1010,maxlen=5000

;struct cyca[maxn];

intn,lens,x,lmax,lena;

intsum[maxlen],ans[maxlen],maxs[maxlen];

bool

cmp(cyc a,cyc b)

void cheng(int

numi)

while(x>0)sum[++lens]=x%10,x/=10;//

printf("1...%d * lens=%d\n",numi,lens);

//for(int i=1;i<=lens;i++)printf("%d",sum[i]);printf("\n");

}void divs(int

numi)

lena=lens;

while(ans[lena]==0&&lena>1)lena--;

//printf("1...%d-1/%d / lens=%d\n",numi,numi,lena);

//for(int i=1;i<=lena;i++)printf("%d",ans[i]);printf("\n");

bool f=1

;

if(lena>lmax)f=0;else

if(lena1;else

for(int i=lena;i>=1;i--)

if(ans[i]>maxs[i])else

if(ans[i]1;break

;}

if(!f)

}int

main()

view code

NOIP提高組2012 國王遊戲

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

貪心 Noip 2012 提高組 國王遊戲

題目鏈結 做法 貪心。考慮大臣 k,k 1 交換。原先 k 的獎勵為 prod limits a i cdot dfrac k 1 的獎勵為 prod limits a i cdot dfrac 原先位置為 k 交換後的獎勵為 prod limits a i cdot dfrac 原先位置為 k 1...

NOIP2012 提高組 day1 國王遊戲

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