题目链接:点击查看

题目大意:恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

题目分析:

先说结论,按照每个大臣的a*b大小升序排序就能得到最优解

证明如下:

首先我们交换第i个位置和第i+1个位置的两个大臣,在此之前他们两人的奖励分别是:

交换之后变为

为了方便观察,我们约分约去

则我们只需要比较下面两个式子的大小关系:

两边同时乘上得:

因为A[i]和B[i]都为正整数,所以

于是当时,左式<=右式,交换前更优,否则交换后更优,所以在任何局面下,减小逆序对数都不会造成整体结果变差,而增加逆序对数则不会使整体结果变好,证毕

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=40100;//最大长度const string ss="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";int mp[150]; void postpoint(string& a)//移位处理
{int len=a.size();a.resize(N);for(int i=0;i<len;i++){a[N-i-1]=a[len-i-1];a[len-i-1]=0;}
}string change(const string& a)//用于解除postpoint
{string ans;for(int i=0;i<N;i++)if(a[i])ans+=a[i];return ans;
}string plu(string a,string b,int base=10)
{postpoint(a);postpoint(b);string temp;temp.resize(N);int f=0;for(int i=N-1;a[i]||b[i]||f;i--){a[i]==0?a[i]='0':0;b[i]==0?b[i]='0':0;temp[i]=(mp[a[i]]+mp[b[i]]+f)%base;f=(mp[a[i]]+mp[b[i]]+f)/base;temp[i]=ss[temp[i]];}return change(temp);
}string mul(string a,int n,int base=10)
{postpoint(a);string temp;temp.resize(N);int f=0;for(int i=N-1;a[i]||f;i--){a[i]==0?a[i]='0':0;temp[i]=(mp[a[i]]*n+f)%base;f=(mp[a[i]]*n+f)/base;temp[i]=ss[temp[i]];}return change(temp);
}string Except(string s,long long x)  //大数除以整形数
{long long cmp=0;bool ok=false;string ans="";for(int i=0;i<s.size();i++){cmp=(cmp*10+s[i]-'0');if(cmp>=x){ok=true;ans+=(cmp/x+'0');cmp%=x;}else{if(ok)ans+='0';  //注意这里}}return ans;
}void init()
{for(int i=0;i<ss.size();i++)mp[ss[i]]=i;
}struct Node
{int a,b;bool operator<(const Node& t)const{return a*b<t.a*t.b;}
}a[10100];int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();int n;scanf("%d",&n);for(int i=0;i<=n;i++)scanf("%d%d",&a[i].a,&a[i].b);sort(a+1,a+1+n);string ans=to_string(a[0].a);string mmax;for(int i=1;i<=n;i++){string temp=Except(ans,a[i].b);if(temp.size()>mmax.size()||temp>mmax)mmax=temp;ans=mul(ans,a[i].a);}cout<<mmax<<endl; return 0;
}

CH - 0701 国王游戏(贪心+高精度运算)相关推荐

  1. 洛谷P1080 国王游戏 贪心+高精度

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

  2. P1080 国王游戏(贪心+高精度乘除及大数比较)

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

  3. 洛谷P1080-国王游戏-贪心+高精度

    P1080-国王游戏 啊啊啊,刚才已经写了一次了,但是Edge浏览器不知道为什么卡住了,难受. 好吧,其实是一道可做题,分析得到的贪心策略就是就是将a * b小的放在前面(其他的懒得说了),主要还是要 ...

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

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

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

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

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

    国王游戏 ybtoj 贪心-1-4 题目大意 有一个国王和n个大臣 每人左右手分别有一个数,现在然你对大臣们排列(国王在第一个) 每个大臣所得金币是前面的人左手上的数的积除以他右手上的数 现在问你获得 ...

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

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

  8. 贪心算法——国王游戏

    题目描述 孙悟空给花果山的小猴子们分桃子. 首先,他让每只小猴在左.右手上面分别写下一个整数,悟空自己也在左.右手上各写一个整数. 然后,让这 n 只小猴排成一排,悟空站在队伍的最前面. 排好队后,所 ...

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

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

最新文章

  1. 关于DataGrid等控件中的自动编号
  2. DHTML中style的display和visibility属性
  3. 微信小程序开发(2)_data属性
  4. iis6中FTP配置的技巧和细节
  5. android小部件如何实时更新,android – 使用AlarmManager手动更新小部件
  6. java对数组进行排序_用Java对数组进行排序所需的最少交换
  7. 攻击 | 破解windows7密码(利用PE系统破解XP密码)
  8. 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性
  9. 比人高效10倍,3分钟就能评估帕金森!这是腾讯新推出的AI医生
  10. OpenCV --- CAMShift对象跟踪
  11. js实现微信浏览器关闭
  12. 预训练模型MT-BERT的探索和应用
  13. appleId登录java
  14. ubuntu 添加证书
  15. Java程序编译及打包
  16. 机器学习入门之二:一个故事说明什么是机器学习(转载)
  17. 像素三国志在线html5小游戏,像素三国志bt版
  18. 物联网:可穿戴设备与世界杯球员
  19. 基于mycat高可用方案——数据库负载(基于阿里云)
  20. 什么是Activity?Activity的生命周期!

热门文章

  1. MySQL语法解析和预处理(Parser Preprocessor)
  2. 【思考?】什么时候会触发这个策略呢?
  3. 初步认识Volatile-一段代码引发的思考
  4. Java 类型和数据库类型怎么实现相互映射?
  5. 把第三方jar包放入本地私服
  6. sqoop导入-hive
  7. SVN目录结构及作用
  8. 字节输出流_OutputStream类FileOutputStream类介绍
  9. Servlet_3.0注解配置
  10. Tomcat集群快速入门:Nginx负载均衡配置,常用策略,场景及特点