codevs 1198 國王的遊戲

2022-08-19 17:27:09 字數 1400 閱讀 9982

題意:

有個國王站在乙個佇列的開頭,左右手各有乙個數字,然後有n個人左右手也各有乙個數字,然後把這n個人隨便排序,定義第i個人的權值為前面所有的人左手數字乘積除以第i個人右手的數字,問的是怎麼排序使得這n個人中最大的權值最小,輸出這個權值。

題解:

問題是怎麼排序使得最大權值最小,那我們就需要知道排序的條件,為了找出這個條件,我們考慮第i個人和第i+1個人。

解:設a,b為第i個人左右手的數字,c,d為第i+1個人左右手的數字,s為第1個人到第i-1個人左手數字的乘積

可以得出第i個人的權值為wi = s / b 第i+1個人的權值為 wi+1 = s * a / d,那麼最大值為max (s / b, s * a / d)

可以得出換了位置之後第i+1個人的權值為 wi+1 = s / d 第i個人的權值為 wi = s * c / b,那麼最大值為max (s / d, s * c / b)

假設換了位置更優 那麼 max (s / d, s * c / b) < max (s / b, s * a / d)

假設s / d > s * c / b 那麼 s / d < max (s / b, s * a / d),很顯然的是s * a / d > s / d,那麼根據s / b > s / d 可以得出d > b 但與條件(b > c * d)矛盾不成立

假設s / d < s * c / b 那麼 s * c / b < max(s / b, s * a / d) 但是 s * c / b > s / b所以不考慮,那麼由 s * c / b < s * a / d 得出 a * b < c * d 符合條件 b < c * d

得出結論:按照左右手乘積從小到大排序一定最優

因為我很懶就沒有寫高精度了qaq

**:

#include #include #include using namespace std;

const int n = 1e3 + 7;

#define ll unsigned long long

int n;

ll sl, sr;

struct node p[n];

bool cmp (node a, node b)

int main ()

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

ll sum = sl, maxi = 0;

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

cout << maxi << endl;

return 0;

}

總結:

這種按照某種方式變化的題型,需要我們找到變化的最優條件,不妨設一設,搞一搞總會搞出來的~

CODEVS 1198 國王遊戲

2012年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n位大臣排成一排,國王站在隊伍的...

國王的遊戲

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

P1080國王的遊戲

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