NC16561 國王的遊戲

2022-09-06 08:48:08 字數 2665 閱讀 7216

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

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

國王不希望某乙個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。注意,國王的位置始終在隊伍的最前面。

第一行包含乙個整數 n ,表示大臣的人數。

第二行包含兩個整數 a 和 b ,之間用乙個空格隔開,分別表示國王左手和右手上的整數。

接下來 n 行,每行包含兩個整數 a 和 b ,之間用乙個空格隔開,分別表示每個大臣左手和右手上的整數。

乙個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。
3 

1 1

2 3

7 4

4 6

2

按 1 、 2 、 3 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2 ;

按 1 、 3 、 2 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2 ;

按 2 、 1 、 3 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2 ;

按 2 、 3 、 1 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 9 ;

按 3 、 1 、 2 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 2 ;

按 3 、 2 、 1 這樣排列隊伍,獲得獎賞最多的大臣所獲得金幣數為 9 。

因此,獎賞最多的大臣最少獲得 2 個金幣,答案輸出 2 。

對於 20%的資料,有 1 ≤ n ≤ 10 < a,b < 8 ;

對於 40%的資料,有 1 ≤ n ≤ 20 <a,b<8 ;

對於 60%的資料,有 1 ≤ n ≤ 100 ;

對於 60%的資料,保證答案不超過 109 ;

對於 100%的資料,有 1 ≤ n ≤1,000 < a,b < 10000 。

**類似***ab***的排列1,如果前面的***左邊乘積為sum,la表示a的左手,ra表示a的右手,那麼a的獎賞是:sum / ra, b的是:sum * la / rb, 兩者最大max(sum / ra, sum * la / rb)

類似***ba***的排列2,如果前面的***左邊乘積為sum,la表示a的左手,ra表示a的右手,那麼a的獎賞是:sum * lb / ra, b的是:sum / rb, 兩者最大max(sum / rb, sum * lb / ra)

如果1小於2,那麼max(sum / ra, sum * la / rb) <= max(sum / rb, sum * lb / ra),因為sum * lb / ra 恆大於 sum / ra,所以排列2只能選sum * lb / ra,因為sum * lb / ra 恆大於 sum / ra,所以sum / rb 恆小於排列2,故只要滿足sum * la / rb <= sum * lb / ra即可保證排列1小於等於排列2,原式可化簡為la * ra <= lb * rb,故在ab中左*右越小應該越靠前(因為我們是要使得最大值最小)。

考慮乙個ln*rn的遞增數列,如果隨意交換任意兩個相鄰的(交換不相鄰的情況例如交換i,j可以考慮成從j到i+1依次與其的前乙個交換),則必定使得最大值可能發生改變,而且改變要麼不變要麼變大,因為你把大的放前面去了。因為交換不相鄰情況也是類似,相當於冒泡的交換過程,就是j和j-1交換,j-1再和j-2交換,以此類推直到i+1與i交換,所以這些交換的情況下都不可能產生比公升序還要大的答案,故,公升序是最小的情況。我們只用對左和右的乘積排序,然後掃一遍最大值即可。

ac**:

#include using namespace std;

struct big_int

int size()

big_int friend operator * (big_int a, big_int b)

if(up != 0)

c.num[i + b.size()] = up;

} for(int i = a.size() + b.size(); i >= 0; i--)

}return c;

} big_int friend operator / (big_int a, int b)

for(int i = a.size(); i >= 0; i--)

}return c;

} big_int operator = (int temp) }

void output()

bool friend operator < (big_int a, big_int b)

return false;

} }};struct node

};node p[10005];

int main()

sort(p + 1, p + n + 1);

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

maxn.output();

return 0;

}

NC16561國王的遊戲

本來以為是乙個很簡單的貪心,結果沒想到還要用高精 include include using namespace std int n int l 1 int g 1000005 struct p a 100009 bool cmp p a,p b void gj1 int x 高精度乘法 l 陣列長...

國王的遊戲

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

P1080國王的遊戲

沒過test6 test8 test9 test10 正在學習大數,未完持續 include include includeusing namespace std int n int ans 100000000 一共15位,每位又有算8位,除去第一位表示位數,共表達191位的數。int c 1000...