洛谷P1080 [NOIP2012 提高组] 国王游戏
这是我的第一版,超级简单,但有个点ac不掉,想了半天才发现我理解错那个规律了
struct people{int a,b;bool operator <(const people x) const{return a*b<x.a*x.b;}
}p[1005];int main() {int n;cin>>n;for(int i=0;i<=n;i++) cin>>p[i].a>>p[i].b;sort(p+1,p+n+1);int hp[10010]={1},len=1;//high precision数组for(int i=1;i<=n;i++) {//循环n次for(int j=0;j<len;j++) hp[j]*=p[i-1].a;for(int j=0;j<len;j++)if(hp[j]>9) {hp[j+1]+=hp[j]/10;hp[j]%=10;}while(hp[len]) {hp[len+1]+=hp[len]/10;hp[len++]%=10;}}for(int i=len-1;i>=0;i--) {hp[i-1]+=hp[i]%p[n].b*10;hp[i]/=p[n].b;}while(!hp[len-1]) {if(len==1) break;len--;}for(int i=len-1;i>=0;i--) cout<<hp[i];return 0;
}
其实思路也真的很简单
1.首先找到规律,按照a*b从小到大的顺序排列,证明方法请自行看题解,不过这个排列方式并不是说最后一个大臣获得的coins一定最多(虽然9个测试点都是这样,不要问我是怎么知道的QAQ),只能说明获得coins最多里且最少(有点拗口)一定在这样一个排列方式里。
2.排好序后直接依次算出每个大臣所获的coins,记录下最大的那个输出即可。
注:
1.因为coins可能会很大,所以需要用到高精
2.乘法的高精很简单,但不同于加法,它的最高位可能进的不止一位,所以用while循环直到最高位不再进位为止
3.最讲究细节的就是高精除法了,规则是从高位到底位,除以除数得到的商保留,余数乘以10放进下一位。反正我是出错了好多次,而且是要从一个数组除以一个数存储到另一个数组,所以最好的方法是借助一个temp
4.单独开一个max高精数组每次与计算出的coins比较,及时更新最大值
struct people{//king and his ministersint a,b;bool operator <(const people x) const{return a*b<x.a*x.b;}
}p[1005];
//三个high precision数组
int mul[10010]={1},len1=1;//每个大臣乘法后得到的数
int dev[10010]={1},len2=1;//每个大臣出发后得到的数
int maj[10010]={0},len3=1;//每次计算出第i个大臣所获得的coins后,顺便比较,记录下最大的那一个
//div重名了,用dev替代;max重名了,用maj代替。void multiply(int num) {for(int i=0;i<len1;i++) mul[i]*=num;//每个位上分别乘以低精度的numfor(int i=0;i<len1;i++)//从低到高依次进位if(mul[i]>9) {mul[i+1]+=mul[i]/10;mul[i]%=10;}while(mul[len1]) {//拓展最高位mul[len1+1]+=mul[len1]/10;mul[len1++]%=10;}
}void division(int num) {len2=len1;//因为除法是建立在乘法计算后得出的数的基础上/*dev[len2-1]=mul[len1-1];for(int i=len2-1;i>=0;i--) {if(i) dev[i-1]=mul[i-1]+dev[i]%num*10;dev[i]=dev[i]/num;}*/int temp=0;for(int i=len2-1;i>=0;i--) {//从高位到低位,除以num得到的商保留,余数乘以10放进下一位temp=temp*10+mul[i];dev[i]=temp/num;temp%=num;}while(!dev[len2-1]) {//删除前导0if(len2==1) break;len2--;}/*int temp=len;for(int i=temp-1;i>=0;i--) {if(hp[i]||len==1) break;len--;}*/
}void maximize(){if(len2>len3) {//如果该大臣的coins位数大于记录最大的coins,就更改majfor(int i=0;i<len2;i++) maj[i]=dev[i];len3=len2;}else if(len2==len3) {//如果位数相同,从高位到低位,比较每个位上数字大小for(int i=len2-1;i>=0;i--)if(dev[i]>maj[i]) {//一旦发现某位上数字大就更新majfor(int j=0;j<len2;j++) maj[j]=dev[j];break;//第一次发现后就可以停止了}}
}
int main() {int n;cin>>n;for(int i=0;i<=n;i++) cin>>p[i].a>>p[i].b;sort(p+1,p+n+1);for(int i=1;i<=n;i++) {//循环n次multiply(p[i-1].a);division(p[i].b);maximize();}for(int i=len3-1;i>=0;i--) cout<<maj[i];return 0;
}
洛谷P1080 [NOIP2012 提高组] 国王游戏相关推荐
- 洛谷P1080 [NOIP2012 提高组] 国王游戏(贪心,高精度)
[题目描述] 恰逢HHH国国庆,国王邀请nnn位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这nnn位大臣排成一排,国王站在队伍 ...
- [NOIP2012提高组]国王游戏
题目:洛谷P1080.Vijos P1779.codevs1198. 题目大意:国王和每个大臣左.右手各写了一个数.规定每个大臣得到的金币数为他前面所有人左手的数字的乘积除以他自己右手的数(向下取整) ...
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...
- 洛谷P1312 [NOIP2011 提高组] Mayan 游戏 题解
题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行 5×5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指 ...
- luoguP1080[NOIP2012提高组]国王游戏
话说要不是标签我都看不出来是个贪心.. 证明一下贪心 XXX的左手为a1a_1a1,右手为b1b_1b1. YYY的左手为a2a_2a2,右手为b2b_2b2 假设X位于Y的前边 位于XXX前 ...
- 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案
[题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...
- 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头
[题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...
- 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏
[题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...
- 信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
[题目链接] ybt 1848:[07NOIP提高组]字符串的展开 OpenJudge NOI 1.7 35:字符串的展开 洛谷 P1098 [NOIP2007 提高组] 字符串的展开 [题目考点] ...
最新文章
- Django详解之models操作
- android 数据存储怎么保存图片_遇到验证码怎么办?Python编写一个验证码图片数据标注GUI程序!...
- 如何在tensorflow2环境运行tensorflow1代码
- android studio 拉取分支,AndroidStudio中使用Git-高级篇(二)——新建分支(branch)和拉取请求(Pull request)...
- 会话管理 轻量php框架_SpringSecurity+JWT权限管理训练营-1基于RBAC模型的权限管理系统...
- 做一个简单的python爬虫_python制作一个简单网络爬虫
- Java实现获取汉字的拼音(首拼)
- 微信小程序实现实时音视通话-腾讯云文档dome里面的大坑
- 网易严选(html+css+js)
- 史上最全自媒体推广工具
- 记一次App异常kill分析处理
- siblings的用法
- PFC电源设计与电感设计计算学习笔记
- Autojs 微信添加好友脚本
- chi2inv函数 matlab_matlab中ltiview怎么使用啊
- 掌财社骑士:顾比均线怎么设置?顾比均线的投资技巧介绍
- LibreOffice Calc - 表格内部换行快捷键
- 数据结构中的L=(List)malloc(sizeof(PtrToNode));是什么意思
- 计算机网络技术跟物联网应用技术,计算机网络工程和物联网应用技术有什么区别...
- 学习python-mysql:报错AttributeError: module 'MySQLdb' has no attribute 'cursors'