NOIP2012d2t2 國王遊戲

2021-07-17 03:35:52 字數 1198 閱讀 6406

題目大意:國王和n個大臣站成一列,編號為0,1,2...n(國王在隊首)每個人有兩個數字(ai,bi),0<=i<=n

問如何排列大臣的序列,使(a0*a1*...*ai-1/bi)(1<=i<=n)中的最大值最小,求這個最小值

首先注意對於100%的資料,有1 ≤ n ≤1,000,0 < a、b < 10000。——高精度,居然要高精度乘單精度,高精度除單精度。。。

這道題可選的排列太多了,應該貪心,ai*bi越大的,越往後放。

說一下怎麼想的:考慮i排在j前的必要條件

假設前面都排好了,前面a的乘積為x,討論i在j前還是j在i前

不難發現,①<=④,③<=②,那麼證明i排在j前更優等價於證明②

易得到i1*i2

所以得到必要條件:ai*bi小於aj*bj

唉,像我這數學不好的以後怎麼混啊。。。

#include #include #include using namespace std;

const int n=1010;

int n;

struct reca[n];

struct bigsum,ans;

int cmp(rec a,rec b)

if(!c.num[c.l-1]) c.l--;

return c;

}void bigprint(big a)

}int main(){

freopen("game.in","r",stdin);

freopen("game.out","w",stdout);

scanf("%d",&n);

scanf("%d%d",&a[0].a1,&a[0].a2);

for(int i=1;i<=n;i++)

scanf("%d%d",&a[i].a1,&a[i].a2),a[i].a3=a[i].a1*a[i].a2;

sort(a+1,a+n+1,cmp);

ans.l=ans.num[0]=0,sum.l=1,sum.num[0]=a[0].a1;

for(int i=1;i<=n;i++){

ans=bigcmp(ans,minus(sum,a[i].a2));

if(i

noip2012d1t2 國王遊戲

題意 給定乙個序列,每個點有a,b兩個權值,每個點的sum值等於前面所有點a值的乘積 該點的b值 序列的值等於所有點的sum的最大值。該序列的點不具單調性,所以無法二分,考慮貪心 首先只考慮由相鄰兩個數組成的二元組 顯然它們的排列順序對前後所有點的值都沒有影響 設這兩個數的權值分別為val i va...

NOIP2012提高組Day1T2 國王遊戲

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

NOIP2012 DAY1 T2 國王遊戲

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