P1080 国王游戏(贪心+大数乘除)
题目描述
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
输入格式
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入输出样例
输入
3
1 1
2 3
7 4
4 6
输出
2
【输入输出样例说明】
按111、222、333 这样排列队伍,获得奖赏最多的大臣所获得金币数为 222;
按 111、333、222 这样排列队伍,获得奖赏最多的大臣所获得金币数为222;
按 222、111、333 这样排列队伍,获得奖赏最多的大臣所获得金币数为 222;
按222、333、111这样排列队伍,获得奖赏最多的大臣所获得金币数为999;
按 333、111、222这样排列队伍,获得奖赏最多的大臣所获得金币数为 222;
按333、222、111 这样排列队伍,获得奖赏最多的大臣所获得金币数为 999。
因此,奖赏最多的大臣最少获得 222个金币,答案输出 222。
【数据范围】
对于 20%的数据,有 1≤n≤10,0<a,b<81≤ n≤ 10,0 < a,b < 81≤n≤10,0<a,b<8;
对于 40%的数据,有1≤n≤20,0<a,b<81≤ n≤20,0 < a,b <81≤n≤20,0<a,b<8;
对于 60%的数据,有 1≤n≤1001≤ n≤1001≤n≤100;
对于 60%的数据,保证答案不超过 10910^9109;
对于 100%的数据,有 1≤n≤1,000,0<a,b<100001 ≤ n ≤1,000,0 < a,b < 100001≤n≤1,000,0<a,b<10000
NOIP 2012 提高组 第一天 第二题
首先要贪心。其次要大数。
贪心简单证明是:先只有两个大臣,他们位置交换得出两个值。然后用数学方法证明。(数学太弱了)
当时只想到贪心,交了,wa了5个数据。还是不明所以。
后来翻博客,又看了一边题。才知道了左手乘积可能达到10的4000次方。
这里采用数组来保存大数的位数。比如a[1]=3456,或者a[1]=13,a[1]=0003,此类的。我们用一个变量保存4个位数。
当然,如果数据较小,我们也可以一个变量保存1位,此时用10代替10000即可。
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
struct node{int le,ri;int mul;
}pe[1111];
bool cmp(node a,node b)
{return a.mul<b.mul;
}
struct ind{public:int digit[1000+1];//位数int size;//多少位void initi()//Initialization初始化{memset(digit,0,sizeof(digit));size=0;}ind operator *(const int &x)//重载乘法{ind ans;ans.initi();int carry=0;//进位 for(int i=1;i<=size;i++){int tep=digit[i]*x+carry;ans.digit[++ans.size]=tep%10000;carry=tep/10000; }if(carry) ans.digit[++ans.size]=carry; return ans;}ind operator /(const int &x){ind ans;ans.initi();int remain=0;//余数for(int i=size;i>=1;i--){int tep=digit[i]+remain*10000;ans.digit[i]=tep/x;remain=tep%x;}for(int i=1;i<=1000;i++)//找到位数{if(ans.digit[i]!=0)//注意,此处不可为==0.试一试10000//中间可能保存为0,实际上是4个零{ans.size=i;}}return ans;}bool operator <(const ind &x)//比较所获金币{if(size<x.size) return true;else if(size>x.size) return false;else{for(int i=size;i>=1;i--){if(digit[i]<x.digit[i]) return true;else if(digit[i]>x.digit[i]) return false;}}}void print(){for(int i=size;i>=1;i--){if(i==size) printf("%d",digit[i]);else printf("%04d",digit[i]);}putchar('\n');}
}ans,coin;
int main(void)
{int n;scanf("%d",&n);n++;for(int i=1;i<=n;i++){scanf("%d%d",&pe[i].le,&pe[i].ri);pe[i].mul=pe[i].le*pe[i].ri;}sort(pe+2,pe+n+1,cmp);ind maxpe;maxpe.initi();ans.initi();ans.digit[1]=1;ans.size=1;for(int i=1;i<n;i++){ans=ans*pe[i].le;//左手乘积coin=ans/pe[i+1].ri;//金币if(maxpe<coin) maxpe=coin; } maxpe.print();
}
参考自https://blog.csdn.net/zhuixun_/article/details/81741821
对自己帮助很大。自己都不会重载,大数也不会。
P1080 国王游戏(贪心+大数乘除)相关推荐
- P1080 国王游戏(贪心+高精度乘除及大数比较)
https://www.luogu.org/problemnew/show/P1080 题目描述 恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数 ...
- 洛谷P1080 国王游戏 贪心+高精度
https://www.luogu.org/problem/P1080 题目描述 恰逢 HH H国国庆,国王邀请n nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王 ...
- # 国王游戏(贪心+大数乘除+微扰法证明)
国王游戏(贪心+大数乘除+微扰法证明) 题意:n个大臣和一个国王,左右手都有一个数,排队,国王始终拍在最前面,每个大臣的奖励为这个大臣前面的人的左手上的数之积除以这个大臣右手上的数.构造最优队伍,使得 ...
- 【题解】P1080 国王游戏(贪心+高精python天下第一)
P1080 国王游戏 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排 ...
- 做题记(4)P1080 国王游戏
今天,做了洛谷上的P1080 国王游戏,题目如下: 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整 ...
- 洛谷P1080 国王游戏(贪心)
国王游戏 题目描述 恰逢 HHH 国国庆,国王邀请 nnn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nnn 位大臣排成 ...
- P1080 国王游戏(贪心)
题意: 有一个国王的左右手上分别写了a0,b0,他把他的n个臣子叫过来,左右手分分别写上ai,bi,每个臣子能获得的奖励是所有站在他前面的人a[i]的乘积除以这个臣子右手上的数字(国王始终站在第一个) ...
- CH - 0701 国王游戏(贪心+高精度运算)
题目链接:点击查看 题目大意:恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一 ...
- 洛谷P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
最新文章
- 我还不懂什么是分布式事务
- ip.php是什么意思,IP是什么意思
- 数据中台实战(八):如何打造可以支撑N条产品线的标签平台
- Java手机游戏新流星蝴蝶剑,手机游戏平台java游戏经典的五款游戏回顾-经典游戏...
- git常用操作命令整理大全(含github操作)
- Redis的设计与实现之整数集合和压缩列表
- SD/MMC相关寄存器的介绍
- android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案
- php5.3升级5.4,centos php 5.3升级到 php5.4版本
- linux中的socket编程,linux中socket编程
- 如何使用 Mac 中的“信息”?
- linux chmod -r,linux chmod -R 777 / 的危害
- 2022年焊工(初级)考试及焊工(初级)考试内容
- android 汉字 转 拼音首字母,Android开发之拼音转换工具类PinyinUtils示例
- linux常用命令整理(详细)
- 小白轻松使用axis2构建webservice
- 《清单革命》:让大脑处理更重要的事情
- mysql停止修复_浅析MySQL 8.0崩溃恢复
- 无标注数据是鸡肋还是宝藏?阿里工程师这样用它
- 如何修改Microsoft edge浏览器主页?
热门文章
- 链表问题4——反转双向链表
- @Accessors
- Technavio:大数据即服务将迎快速增长期
- 看看XStream注解
- Mysql 内部结构 / Replication | 原理
- 6个强大的PHP/Mysql代码生成器介绍
- vista——最恰当的中文译名应该是“喂死它”
- sklearn API快速上手
- python urlretrieve登录下载_使用python urlretrieve下载文件
- 模糊综合评价法用什么软件实现_基于建管养一体化模式的钢桥面铺装方案综合评价分析...