繼續寫高精!noip2012國王遊戲。。。

2022-05-10 04:06:06 字數 2915 閱讀 3813

恰逢 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,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。

時間限制:1000ms

空間限制:256mbyte

初看此題,居然沒有第一時間反應過來這居然是貪心(只是想練練高精而已tat),結果想了好久才發現可以貪❤,然後加個高精乘除比較就好了。

下面證明一下貪心的正確性:

我們設第i個大臣左手是a[ i ] , 右手是b[ i ] , w[i]代表a[ 1 ]  *  a[ 2 ]  *  a[ 3 ]  * ... *  a[ i ]  , val[ i ] 代表這第i個大臣可以獲得的錢數;

不難發現 , val [ i ] = w[ i - 1 ]  /  b [ i ]   ,   val [ i + 1 ] = w[ i ] / b [ i + 1 ];

應為w[ i ]  =  w [ i - 1 ] * a [ i ];

所以  val [ i + 1 ] = w[ i ] / b [ i + 1 ]  =  w [ i - 1 ] * a [ i ] / b [ i + 1 ];

將這兩條式子相除

val [ i ] = w[ i - 1 ]  /  b [ i ] ;

val [ i + 1 ] = w[ i ] / b [ i + 1 ]  =  w [ i - 1 ] * a [ i ] / b [ i + 1 ];

得到:    val [ i ] / val[ i + 1 ] = b [ i + 1 ] / (b [ i ] * a [ i ]);

移項得到:   val[ i + 1]  =  a [ i ] * b [ i ] * val [ i ] / b[ i + 1 ];

應為b[ i + 1 ]是固定的,所以val[ i + 1]的大小只和a [ i ] * b [ i ] * val [ i ]有關係;

現在考慮讓val[ i + 1 ] 最小,應為前面i個已知,所以val[ i ]是確定的。

所以為了讓val[ i + 1 ]最小,就要讓a[ i ] * b[ i ]小;

所以只要在(1 ~ i)之間用a[ i ] * b[ i ]排序就好啦;

推廣到整個佇列就也這樣排序;

#include#include

#include

#include

#include

#define ll long long

#define _ 8

#define mod 100000000

#define maxn 10050

using

namespace

std;

struct

bg};

struct

sts[maxn];

bool

com(st a , st b)

inline

bool

operator

<(bg a , bg b)

return0;

}inline ostream& operator

<<(ostream &os , bg x)

inline bg

operator *(bg a , ll b)

while

(jin)

returna;}

inline bg

operator /(bg a , ll b)

pos++;

bg c;

if(pos == 1 && rest < b) return

c; c.size =pos;

while

(pos)

if(!c.v[c.size]) c.size--;

returnc;}

intn;

bg ans,ma;

intmain()

cout

<< ma <}

noip 2012 國王遊戲(貪心 高精)

我是不會說我考試的時候想到了正解卻把金幣取大看成金幣求和的.覺得只按左右手乘積排序不太對 有反例 也可能我反例放到這個題裡是錯的吧 按自己的理解排的序 就是各種討論.假設 第i個人是x1 y1 第i 1個人是x2 y2 前面所有的左手乘積為s 我們通過考慮這兩個人決定排序的規則 答案就是 min m...

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...