【題意】
恰逢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#includeview codeusing
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()
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...