国王游戏

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)相关推荐

  1. # 国王游戏(贪心+大数乘除+微扰法证明)

    国王游戏(贪心+大数乘除+微扰法证明) 题意:n个大臣和一个国王,左右手都有一个数,排队,国王始终拍在最前面,每个大臣的奖励为这个大臣前面的人的左手上的数之积除以这个大臣右手上的数.构造最优队伍,使得 ...

  2. 【题解】P1080 国王游戏(贪心+高精python天下第一)

    P1080 国王游戏 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排 ...

  3. 洛谷P1080 国王游戏(贪心)

    国王游戏 题目描述 恰逢 HHH 国国庆,国王邀请 nnn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nnn 位大臣排成 ...

  4. P1080 国王游戏(贪心+大数乘除)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...

  5. 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍 ...

  6. 国王游戏(贪心+模拟)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...

  7. 国王游戏(贪心算法+高精度运算)

    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍的最前面. ...

  8. 【NOIP2012】【Luogu1080】国王游戏(贪心,邻项交换)

    problem n个人,每个人左手右手各写有一个数字. 把n个人排成一列,每个人得到的奖金是前面所有人左手上数字的乘积除以自 己右手上的数字下取整. 最小化每个人奖金的最大值. solution 一. ...

  9. NOIP 贪心 国王游戏

    https://www.luogu.org/problemnew/show/P1080 题目描述 恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整 ...

  10. 洛谷P1080 [NOIP2012 提高组] 国王游戏(贪心,高精度)

    [题目描述] 恰逢HHH国国庆,国王邀请nnn位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这nnn位大臣排成一排,国王站在队伍 ...

最新文章

  1. Nexenta和ParaScale发布开源存储产品
  2. mysql 逻辑处理_mysql 逻辑查询处理流程
  3. Adobe和苹果相互推诿 不支持Flash谁之过?
  4. 看病(信息学奥赛一本通-T1371)
  5. 基于主机Overlay和自研虚拟化网关的VPC在360的落地
  6. 20道有代表性的HTML基础题,测测你能入前端的门吗
  7. http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html
  8. restful soap_Web服务面试问题– SOAP,RESTful
  9. 变量的命名规则与惯例
  10. java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
  11. 京东万能转链API接口 含商品信息优惠券转链 京东线报如何转链?
  12. 自己收集的全国行政区划,具体到县级,不包括过直辖市和特别行政区
  13. 关于需求确认的重要性
  14. android图标分组名称唯美简单可复制,分组名称唯美简短的
  15. Kaldi 实践与探索 语音识别基本法 pdf
  16. Laravel 留言评论功能
  17. 为什么软件工程师的脾气都这么暴躁
  18. kali下生成木马的工具
  19. PKM知识管理最佳实践——2020年个人版
  20. H5获取用户code,换openID

热门文章

  1. 紫光物联linux登录账号,紫光展锐打造操作系统生态,赋能万物互联智能时代
  2. python 里什么时候缩进_python什么时候缩进
  3. 14考研计算机考前,计算机专业考研考前终极预测试题.docx
  4. 开发板实现645协议C语言,迅为-imx6ull开发板之C语言实现LED例程
  5. leetcode53. 最大子数组和(动态规划)
  6. leetcode349. 两个数组的交集(思路+详解)
  7. AVL树的旋转与插入(C语言)
  8. LeetCode 04检查平衡性-简单
  9. java进阶之注解篇
  10. mysql outfile 变量_转mysql dumpfile 与 outfile 函数的区别