【NOIP2012】国王游戏
这一次高精度完美地过辣好开心OvO,还get到了非常方便的高精度除小于10000的方法,这个是我自己脑出来的OvO
看来下午高精度傻逼得值qvq
原题:
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右 手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排 成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
1 ≤ n ≤1,000,0 < a、b < 10000。
最大的最小,看上去好像二分的样子,然而没有单调性没法二分
可以先只看两个之间,只看这两个人的话前面的都不用管了,如果a1/b2>a2/b1,=>a1*b1>a2*b1,然后交换这两个就可以让这两个人中较大的更小
(网上题解是这么说的,我没看懂
然后按照a*b升序排序,模拟一下即可
数很大,要高精度
小技巧:
高精度除一个小于10000的数,直接用万进制从高位开始除,把除剩下的数也就是这一位膜除的数的结果乘10000加到下一位上去,继续往下除
结果的长度是被除数的长度-(被除数最高位>除数)
其它单精度数也可以这么玩儿,效率未知,应该不会太慢
好开心OvO
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int ss=;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
int n; struct cdd{int a,b;}a[];
bool compare(cdd x,cdd y){ return x.a*x.b<y.a*y.b;}
int mul_a[],mul_b[],ans[];
int c[];
void copy(int *x,int *y){memset(y,,sizeof(y)); y[]=x[]; for(int i=;i<=x[];i++) y[i]=x[i];}
void cheng(int *x,int z){
for(int i=;i<=x[];i++) x[i]*=z;
for(int i=;i<=x[];i++) x[i+]+=x[i]/ss,x[i]%=ss;
while(x[x[]+]){ x[]++; x[x[]+]+=x[x[]]/ss,x[x[]]%=ss;}
}
bool bi(int *x,int *y){
if(x[]>y[]) return true;
if(x[]<y[]) return false;
for(int i=x[];i>=;i--)if(x[i]!=y[i]) return x[i]>y[i];
return true;
}
void chu(int *x,int *y,int z){//因为除的数<10000,刚好在万进制范围内,就直接除单精了
copy(y,c);
x[]=c[]-(c[c[]]<z);
for(int i=c[];i>=;i--){
x[i]=c[i]/z;
c[i-]+=(c[i]%z)*ss;
}
for(int i=;i<=x[];i++) x[i+]+=x[i]/ss,x[i]%=ss;
while(x[x[]+]){ x[]++; x[x[]+]+=x[x[]]/ss,x[x[]]%=ss;}
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n;
for(int i=;i<=n;i++) a[i].a=read(),a[i].b=read();
sort(a+,a+n+,compare);
mul_a[mul_a[]=]=a[].a;
for(int i=;i<=n;i++){
chu(mul_b,mul_a,a[i].b);
if(bi(mul_b,ans)) copy(mul_b,ans);
cheng(mul_a,a[i].a);
}
cout<<ans[ans[]];
for(int i=ans[]-;i>=;i--) printf("%04d",ans[i]);
cout<<endl;
return ;
}
【NOIP2012】国王游戏的更多相关文章
- 继续写高精!noip2012国王游戏。。。
国王游戏 题目描述: 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- NOIP2012 国王游戏
2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...
- [noip2012]国王游戏<贪心+高精度>
题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...
- NOIP2012国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在 ...
- NOIP2012国王游戏(60分题解)
题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面 ...
- [NOIP2012]国王游戏 题解
题目大意: n个人排成一排,排头固定,其他可以变.每一个人左右手都有一个整数,一个人的分数为他所有前面的人左手上的数的乘积除以他右手上的数(向下取整),求在整列中最大分数的最小值. 思路: 首先,一切 ...
- [NOIp2012] 国王游戏(排序 + 贪心 + 高精度)
题意 给你两个长为 \(n+1\) 的数组 \(a,b\) ,你需要定义一个顺序 \(p\) (\(p_0\) 永远为 \(0\)) 能够最小化 \[ \max_{i=1}^{n} \frac{\pr ...
- 洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度
题目:https://www.luogu.org/problemnew/show/P1080 排序方法的确定,只需任取两个人,通过比较与推导,可以得出ai*bi小的人排在前面: 高精度写的时候犯了些细 ...
- Luogu P1080 [NOIP2012]国王游戏
题目 按\(a_i*b_i\)升序排序即可. 证明考虑交换法. 对于排序后相邻的两个人\(i,j(a_ib_i\le a_jb_j)\),设前面的总的积为\(s\),则当前答案为\(\max(\fra ...
- Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...
随机推荐
- Ajax get方法 IE 下乱码
每个浏览器处理编码的格式不同. ajax使用utf-8来编码发送数据,ie在发送时并没加上charset=utf-8,从而导致乱码(IE默认使用iso-8859-1编码) JavaScript代码: ...
- 刷固件Layer1到手机FLASH(硬刷)
开头: 注意:本文章并不是做GSM 嗅探必须的,平时我们刷机叫软刷是刷到内存里面的,断电就消失了,这个是硬刷,刷到flash里面的,断电不消失,开机就运行的. 本文章经过作者实测可行,这只是单个应用程 ...
- Postfix之sasldb2
# 2.#配置postfix启用sasldb2作为smtp的账号秘密效验方式 3.#编辑通过sasl启用smtp账号密码效验的配置 4.vi /etc/sasl2/smtpd.conf #vi写入或编 ...
- 看了这篇文章,Java编程速度我都惊呆了
熟记于心,打遍天下,(开始装了) 保存 Ctrl+s (这个就不用解释了吧!!!!) 注释代码 Ctrl+/ 取消注释 Ctrl+/代码辅助 Alt+/ 快速修复 ...
- Oracle常用SQL语句
--2.查看表结构 desc wx_monitor_excption; --3.从表中查询数据 select * from wx_monitor_excption; --7.双引号保持原来的格式 se ...
- JQuery事件手册
blur.focus blur失去焦点:focus获得焦点 load 当指定的元素(及子元素)已加载时,会发生 load() 事件 resize 当调整浏览器窗口的大小时,发生 resize ...
- Http的请求的全过程
http请求的详细过程 HTTP是一个应用层的协议,在这个层的协议,是一种网络交互需要遵守的一种协议规范. 1.连接:当输入一个请求时,首先建立一个socket连接,因为socket是通过ip和端口建 ...
- 如何重启Activity
有的时候,我们只是想重启某个Activity,但是不重启整个App. 一种做法是: Intent intent = getIntent(); overridePendingTransition(0, ...
- Bandicam视频录制技巧总结+小丸工具箱压缩视频解决视频体积问题
1.视频录制. 录制质量建议选择100,保证原文件的质量才能更好地保证渲染转码后输出视频的质量.音效这里就一个关键点,就是编码器默认的MPEG-1 L2,会导致会声会影渲染输出出错,程序强行关闭,Ve ...
- UIImage加载图片的两种方法区别
Apple官方的文档为生成一个UIImage对象提供了两种方法加载图片: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数也是图片文件的路 ...