日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【贪心】国王游戏(ybtoj 贪心-1-4)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【贪心】国王游戏(ybtoj 贪心-1-4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

國王游戲

ybtoj 貪心-1-4

題目大意

有一個國王和n個大臣
每人左右手分別有一個數,現在然你對大臣們排列(國王在第一個)
每個大臣所得金幣是前面的人左手上的數的積除以他右手上的數
現在問你獲得金幣最多的大臣最少得多少金幣

樣例輸入

3 1 1 2 3 7 4 4 6

樣例輸出

2

數據范圍

考慮交換相鄰的大臣
sis_isi?為前i個大臣左手的數字之積
如果交換第i,i+1個大臣,那么有:

第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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。