【贪心】国王游戏(ybtoj 贪心-1-4)
國王游戲
ybtoj 貪心-1-4
題目大意
有一個國王和n個大臣
每人左右手分別有一個數,現在然你對大臣們排列(國王在第一個)
每個大臣所得金幣是前面的人左手上的數的積除以他右手上的數
現在問你獲得金幣最多的大臣最少得多少金幣
樣例輸入
3 1 1 2 3 7 4 4 6樣例輸出
2數據范圍
考慮交換相鄰的大臣
設sis_isi?為前i個大臣左手的數字之積
如果交換第i,i+1個大臣,那么有:
| 交換前 | si?1ri\frac{s_{i-1}}{r_i}ri?si?1?? | si?1×liri+1\frac{s_{i-1}\times l_i}{r_{i+1}}ri+1?si?1?×li?? |
| 交換后 | si?1ri+1\frac{s_{i-1}}{r_{i+1}}ri+1?si?1?? | si?1×li+1ri\frac{s_{i-1}\times l_{i+1}}{r_i}ri?si?1?×li+1?? |
所取到的最大值分別是max(si?1ri,si?1×liri+1)max(\frac{s_{i-1}}{r_i},\frac{s_{i-1}\times l_i}{r_{i+1}})max(ri?si?1??,ri+1?si?1?×li??)和max(si?1ri+1,si?1×li+1ri)max(\frac{s_{i-1}}{r_{i+1}},\frac{s_{i-1}\times l_{i+1}}{r_i})max(ri+1?si?1??,ri?si?1?×li+1??)
同時除以si?1s_{i-1}si?1?
得到max(1ri,liri+1),max(1ri+1,li+1ri)max(\frac{1}{r_i},\frac{l_i}{r_{i+1}}),max(\frac{1}{r_{i+1}},\frac{l_{i+1}}{r_i})max(ri?1?,ri+1?li??),max(ri+1?1?,ri?li+1??)
同時乘ri×ri+1r_i\times r_{i+1}ri?×ri+1?
得到max(ri+1,ri×li),max(ri,ri+1×li+1)max(r_{i+1},r_i\times l_i),max(r_i,r_{i+1}\times l_{i+1})max(ri+1?,ri?×li?),max(ri?,ri+1?×li+1?)
其中ri+1?ri+1×li+1,ri?ri×lir_{i+1}\leqslant r_{i+1}\times l_{i+1},r_i\leqslant r_i\times l_iri+1??ri+1?×li+1?,ri??ri?×li?
若ri+1×li+1?ri×lir_{i+1}\times l_{i+1}\geqslant r_i\times l_iri+1?×li+1??ri?×li?
則ri+1×li+1?max(ri+1,ri×li),r_{i+1}\times l_{i+1}\geqslant max(r_{i+1},r_i\times l_i),ri+1?×li+1??max(ri+1?,ri?×li?),
所以ri+1r_{i+1}ri+1?沒有判斷的價值,rir_iri?同理
所以可以直接對l×rl\times rl×r來進行判斷考慮是否交換
綜上所述, 對l×rl\times rl×r排個序,然后高精處理即可
代碼
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; ll n, x, y, g, a[4020], b[4020], ans[4020]; struct node {ll x, y;bool operator <(const node b) const{return x * y > b.x * b.y;//排序} }; priority_queue<node>d; int main() {scanf("%lld%lld%lld", &n, &x, &y);g = 1;while(x){b[g] = x % 10;x /= 10;g++;}for (int i = 1; i <= n; ++i) {scanf("%lld%lld", &x, &y);d.push((node){x, y});}while(!d.empty()){node h = d.top();d.pop();g = 0;for (int i = 4010; i > 0; --i){a[i] = (b[i] + g * 10) / h.y;g = (b[i] + g * 10) % h.y;//前面的l除以當前的r}g = 0;for (int i = 4010; i > 0; --i)if (a[i] > ans[i])//取最大值{g = i;break;}else if (a[i] < ans[i]) break;for (int i = 1; i <= g; ++i)ans[i] = a[i];g = 0;for (int i = 1; i <= 4010; ++i){b[i] = b[i] * h.x + g;//乘上lg = b[i] / 10;b[i] %= 10;}}g = 4010;while(g > 1 && !ans[g]) g--;for (int i = g; i > 0; --i)putchar(ans[i] + 48);return 0; }總結
以上是生活随笔為你收集整理的【贪心】国王游戏(ybtoj 贪心-1-4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 闫妮演过的电视剧 闫妮演过的电视剧大全
- 下一篇: 【二分】数列分段(ybtoj 二分-1-