貪心 Noip 2012 提高組 國王遊戲

2022-03-29 15:10:28 字數 1655 閱讀 5302

題目鏈結

做法:貪心。

考慮大臣 \(k, k + 1\) 交換。

原先 \(k\) 的獎勵為 \(\prod\limits_^ a_i \cdot \dfrac\),\(k + 1\) 的獎勵為 \(\prod\limits_^ a_i \cdot \dfrac}\)。

原先位置為 \(k\) 交換後的獎勵為 \(\prod\limits_^a_i \cdot \dfrac}\), 原先位置為 \(k + 1\) 交換後的的獎勵為 \(\prod\limits_^ a_i \cdot \dfrac}\)。

我們考慮 \(2\) 種操作哪種最優 。

因為其他的大臣的獎勵都沒有改變,所以我們只需比較以上兩組式子的最大值變化:

提取公因式 \(\prod\limits_ ^ a_i\) 之後,相當於只要比較 \(\max(\dfrac, \dfrac})\) 和 \(\max(\dfrac},\dfrac})\) 的大小關係。

考慮兩邊同時乘以 \(b_k \cdot b_\),即比較 \(\max(b_, a_k \cdot b_k)\) 和 \(\max(a_ \cdot b_, b_k)\) 的大小關係。

因為任意的 \(a_i\) 和 \(b_i\) 都是正整數,所以 \(a_k \cdot b_k > a_k\),\(a_ \cdot b_ > a_\)。

故我們只需要比較 \(a_k \cdot b_k\) 和 \(a_ \cdot b_\) 的大小關係。 若 \(a_k \cdot b_k < a_ \cdot b_\) 則更換前更優,

否則更換後更優,也就是說,我們只需要將 \(a_i \cdot b_i\) 作為排序關鍵字,這樣得到的序列便是最優解。

\(code:\)

#include #define lep(i, r, l) for (int i = r; i >= l; --i)

#define rep(i, l, r) for (int i = l; i <= r; ++i)

const int maxn = 1e4 + 10;

using namespace std;

inline int read()

struct num

}num operator*(const num &a) const

c.s[i + len] = x;

}c.len = a.len + len;

while (!c.s[c.len] && c.len != 1)

c.len--;

return c;

}num operator/(const int &a) const

while (!c.s[c.len] && c.len != 1)

c.len--;

return c;

}bool operator<(const num &x) const

};struct king

finger[maxn];

inline int cmp(king x, king y)

int n;

num res, ans;

int main()

lep(i, ans.len, 1) cout << ans.s[i];

return 0;

}

NOIP2012 提高組 day1 國王遊戲

題解這道題是一道貪心題,大家只需要找到貪心策略是左手與右手的乘積,然後從小到大sort一下就ok了 不過大家有一點需要小小注意一下,需要打乙個高精度,要不然就只有60了 include define maxn 10005 using namespace std int a 10005 n,len,x...

NOIP2012 提高組 day1 國王遊戲

由公式推導出 當大臣按照 a b由小到大排列時,會使得答案取到最小,算出每個人的金幣數比較即可 要用高精度乘法和除法,否則只有60分。include h using namespace std typedef long long ll const int n 10050,m 4005 struct ...

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

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