noip2012 國王遊戲

2021-08-10 06:25:34 字數 2646 閱讀 7114

題目描述

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

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

輸入輸出格式

輸入格式:

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

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

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

輸出格式:

輸出只有一行,包含乙個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。

輸入輸出樣例

輸入樣例#1: 複製

3 1 1

2 3

7 4

4 6

輸出樣例#1: 複製

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,0 < a、b < 8;

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

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

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

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

noip 2012 提高組 第一天 第二題

貪心。話說我覺得今年noip會有一道貪心的題。多刷一些貪心。

貪心,一旦證明了是貪心的思想,就很好寫。關鍵是證明區域性最優一定會達到全域性最優

首先明確相鄰的兩個大臣交換位置,只會對他們兩個人造成影響,而不會影響到前面或後面的人、

那麼假設現在已經排了i-1個大臣,p=a[1]* a[2] * a[3] * ……* a[i-1];

若i大臣在i+1大臣的前面

第i個大臣的錢w[i]=p/b[i],

第i+1個大臣的錢w[i+1]=p*a[i]/b[i+1]

若i+1大臣在i大臣前面

第i個大臣的錢w[i]=p*a[i+1]/b[i],

第i+1個大臣的錢w[i+1]=p/b[i+1];

顯然p* a[i+1]/b[i]>p/b[i] && p*a[i]/b[i+1]>p/b[i+1]

所以兩個裡面的最大值在p* a[i+1]/b[i] 和 p*a[i]/b[i+1] 之間

若p*a[i+1]/b[i] > p*a[i]/b[i+1](這樣就是i+1大臣排在i後面最大值會更小) 則 a[i+1]*b[i+1]>a[i]*b[i]

所以如果要讓大臣得到的錢的最大值最小就要保證兩個相鄰的大臣,前面的左手 * 右手《後面的左手 * 右手。所以按照a*b從小到大排序

注意要用高精度。

陣列開小了白丟30分!noip丟這樣的分可真是太可惜了。

一周後的noip中,陣列在保證不mle的前提下不妨開的大一點以防萬一。

#include

#include

#include

#include

using namespace std

;int n,sum,a[10001],s[10001];

struct st;

struct chenchen[10001];

st ans;

int read()

while (ch>='0'&&ch<='9')

return now*f;

}bool comp(chen a,chen b)

bool ifbig(st a,st b)

void shuchu(st a)

stmul(st a,st b)

while (c.a[++c.len])

while (!c.a[c.len]&&c.len>=2) c.len--;

return c;

}st dev(st a,int b)

while (!c.a[c.len]&&c.len>=2) c.len--;

return c;

}st zhuanhua(int x)

return c;

}void work()

}int main()

noip2012國王遊戲

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

NOIP2012 國王遊戲

題解 一開始看著題覺得是二分答案 最大值的最小值 後來發現不滿足單調性 再後來發現可以用貪心做 只需把大臣按照左手 右手公升序排序即可 證明 很顯然前面的大臣位置隨便調換對後面的大臣並沒有影響 那麼假設現在已經排了i 1個大臣,p a 1 a 2 a 3 a i 1 第i個大臣的錢w i p b i...

NOIP2012國王遊戲

用貪心可以解決。將所有人按左右手的乘積排序,這樣一定可以保證結果最優。現給出證明 首先,任意相鄰兩人的順序對於排在他們前面和後面的人沒有影響。顯然 兩人左右手上的數字分別為l 1 r 1 l 2 r 2 令l 1 r 1 若1在2前面,那麼兩人分得的金幣分別為sum r 1 sum l 1 r 2 ...