话说要不是标签我都看不出来是个贪心。。

证明一下贪心

XXX的左手为a1a_1a1​,右手为b1b_1b1​。

YYY的左手为a2a_2a2​,右手为b2b_2b2​

假设X位于Y的前边

位于XXX前的大臣左手的乘积和S1S_1S1​ 位于XXX前的大臣的右手的数为M1M_1M1​
a1a_1a1​ b1b_1b1​
这一段(a1( a_1(a1​ 到a2)a_2)a2​)的左手乘积S2S_2S2​ YYY前面大臣的右手的数M2M_2M2​
a2a_2a2​ b2b_2b2​

此时:

XXX所得的金币:S1b1\frac{S_1}{b_1}b1​S1​​

YYY所得的金币:S1a1S2b2\frac{S_1 a_1 S_2}{b_2}b2​S1​a1​S2​​

则最小金币数为max(S1b1,S1a1S2b2)max( \frac{S_1}{b_1},\frac{S_1 a_1 S_2}{b_2})max(b1​S1​​,b2​S1​a1​S2​​)

将X和Y的位置调换

位于YYY前的大臣的左手乘积和S1S_1S1​ 位于YYY前的大臣的右手乘积和M1M_1M1​
a2a_2a2​ b2b_2b2​
这一段的左手乘积S2S_2S2​ XXX前面大臣的右手的数M2M_2M2​
a1a_1a1​ b2b_2b2​

此时:

YYY所得的金币:S1b2\frac{S_1}{b_2}b2​S1​​
XXX所得的金币:S1a2S2b1\frac{S_1 a_2 S_2}{b_1}b1​S1​a2​S2​​

则最小金币数为max(S1b2,S1a2S2b1)max( \frac{S_1}{b_2},\frac{S_1 a_2 S_2}{b_1})max(b2​S1​​,b1​S1​a2​S2​​)

假设X在前优于Y在前


①:max(S1b1,S1a1S2b2max( \frac{S_1}{b_1},\frac{S_1a_1 S_2 }{b_2}max(b1​S1​​,b2​S1​a1​S2​​ <<< max(S1b2,S1a2S2b1max( \frac{S_1}{b_2} , \frac{S_1 a_2 S_2}{b_1}max(b2​S1​​,b1​S1​a2​S2​​恒成立
因为②:S1b1<=S1a2S2b1\frac{S_1}{b_1}<= \frac{S_1a_2S_2}{b_1}b1​S1​​<=b1​S1​a2​S2​​ 恒成立
且 ③S1b2<=S1a1S2b2\frac{S_1}{b_2}<= \frac{S_1a_1 S_2}{b_2}b2​S1​​<=b2​S1​a1​S2​​恒成立

若要在②③基础上满足上述条件①则
首先要满足 S1a1S2b2<\frac{S_1a_1S_2}{b_2} <b2​S1​a1​S2​​<S1a2S2b1\frac{S_1a_2S_2}{b_1}b1​S1​a2​S2​​恒成立
即a1b1<a2b2a_1 b_1 < a_2 b_2a1​b1​<a2​b2​

粗略说一下

在②③基础上,左边maxmaxmax取S1a1S2b2\frac{S_1 a_1 S_2} {b_2}b2​S1​a1​S2​​,右边取S1a2S2b1\frac{S_1a_2S_2} {b_1}b1​S1​a2​S2​​才能使①成立
综上
我们需按照左右手乘积的排列大臣
补充
不考虑向下取整是因为:不考虑向下取整的最优解在向下取整的条件下不会比其余的解更劣

高精度

100%的数据范围要求使用高精乘除(不用luogu提交只有60pts)

Code

#include<bits/stdc++.h>
#define ll long long
#define maxn 10005
using namespace std;
int n;
int lena=1,lens=1,lenm=1;
int sum[maxn]={0,1},minn[maxn]={0,1},ans[maxn];
//sum用来存储每一位大臣前边大臣的左手数字乘积
//ans存储每个大臣对应的sum值除以右手的值
//minn存储最小的最大值 (即答案.....
struct node{ll z,y;
}e[maxn];
bool cmp(node x,node y){return x.z*x.y<y.z*y.y;
}
void cheng(ll x){int num=0;for(int i=1;i<=lens;i++){sum[i]*=x;}for(int i=1;i<=lens;i++){num+=sum[i];sum[i]=num%10;num/=10;}while(num){lens++;sum[lens]=num%10;num/=10;}
}
void chu(ll x){memset(ans,0,sizeof(ans));lena=lens;int num=0;for(int i=lena;i>=1;i--){num*=10;num+=sum[i];if(num>=x){ans[i]=num/x;num%=x;}}while(ans[lena]==0&&lena>1){//除去前导零 lena--;}
}
void maxx(){if(lena>lenm){for(int i=1;i<=lena;i++){minn[i]=ans[i];}lenm=lena;}else if(lena==lenm){for(int i=lena;i>=1;i--){if(minn[i]<ans[i]){for(int j=1;j<=lena;j++){minn[j]=ans[j];    }break;}}}
}
int main(){scanf("%d",&n);scanf("%d%d",&e[0].z,&e[0].y);sum[1]=1;//初始为1才能存进数去 for(int i=1;i<=n;i++){scanf("%d%d",&e[i].z,&e[i].y);}sort(e+1,e+n+1,cmp);for(int i=1;i<=n;i++){cheng(e[i-1].z);//乘 chu(e[i].y);//除 maxx();//取最大值 }for(int i=lenm;i>=1;i--){cout<<minn[i];}return 0;
}

luoguP1080[NOIP2012提高组]国王游戏相关推荐

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

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

  2. [NOIP2012提高组]国王游戏

    题目:洛谷P1080.Vijos P1779.codevs1198. 题目大意:国王和每个大臣左.右手各写了一个数.规定每个大臣得到的金币数为他前面所有人左手的数字的乘积除以他自己右手的数(向下取整) ...

  3. 洛谷P1080 [NOIP2012 提高组] 国王游戏

    这是我的第一版,超级简单,但有个点ac不掉,想了半天才发现我理解错那个规律了 struct people{int a,b;bool operator <(const people x) cons ...

  4. [NOIP 2013提高组]转圈游戏 题解

    这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...

  5. [NOIP2012] 提高组 洛谷P1080 国王游戏

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

  6. 【NOIP2012 提高组】 国王游戏

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

  7. 国王游戏 [NOIP2012 提高组]

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

  8. 洛谷 [NOIP2012 D1T2] P1080 国王游戏

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

  9. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

最新文章

  1. BAT都在悄悄“拆”中台,“碎片化中台” 时代已来!
  2. 网络编程(part5)--文件读写偏移量及文件描述符
  3. php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel
  4. jQuery实现字体变大和缩小
  5. 消息队列中间件的技术选型分析
  6. PHP面向对象学习(一)
  7. Vite理论知识笔记一
  8. 服务性能测试和内存监控
  9. 【财务篇】如何群发工资条?
  10. 晶振波形不是正弦波_求助各位!有源晶振出来的波形是方波还是正弦波?
  11. html照片360度旋转展示,纯js实现360度旋转预览图片特效
  12. html 图片不能选中状态,css图片不让选中状态如何实现
  13. 固态硬盘usb测试软件,固态硬盘检测修复坏道三级OP设置软件HDAT2 5.3 ISO版
  14. IOS TableViewCell分割线设置和隐藏多余cell
  15. ESD的防护要求和器件注意事项
  16. Win10离线安装.NET Framework 3.5的方法技巧(附离线安装包下载)
  17. C#上位机开发串口通信编程——倒计时器开发
  18. 深度学习训练时GPU利用率忽高忽低问题
  19. 深信服---之上网行为管理
  20. 2022办公企业邮箱申请流程,总结申请公司电子邮箱的步骤是什么?

热门文章

  1. Kmeans(C/C++实现,以足球队聚类为例)
  2. 使用ASP.NET Core构建RESTful API的技术指南
  3. 彻底关闭烦人的---FF新推荐
  4. ECharts图表重加载刷新数据
  5. 远程访问云服务器CentOS下 jupyter服务 【保姆级教程】
  6. “每天8杯水”错了,人类首个饮水公式在此 | Science
  7. SpringMVC(三)——响应
  8. 响应式微服务_低风险整体式微服务演进第二部分
  9. Mybatis01_基础详细入门案例
  10. 使用Qt创建一个C语言工程