【NOIP2012DAY1】国王游戏
题目
恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,
使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
乱说几句
题目并不是特别特别难,但是这道题目的思想十分的好,在很多其它的题目中也有体现这个思想。
题解
假如我们现在当前这个序列中,交换两个相邻的大臣(假设他们是i和i+1大臣),很容易想到交换他们两个是不会影响其他大臣的奖赏的,(首先,交换这两个大臣,与前i-1个是毫无干系的,齐次,交换之后,乘积没有变,自然后面的大臣的奖赏都没有变,变的只是i和i+1大臣),我们假设第i个大臣的左手和右手分别为a,b,i+1大臣的左右手分别为c,d,记前i-1位大臣的左手的乘积为s,没有交换这两个大臣时这两个大臣的奖赏的最大值为N,以及交换这两个大臣时这两个大臣的奖赏的最大值为M。假设a×b≤c×da \times b \le c \times d那么
N=max{s÷b,s×a÷d}max\{s\div b,s \times a \div d\}
M=max{s÷d,s×c÷b}max\{s \div d,s\times c\div b\}
因为a×b≤c×da \times b\le c \times d
所以s×a÷d≤s×c÷bs \times a \div d \le s \times c \div b
又因为s÷d≤s×a÷ds \div d \le s \times a \div d
所以s÷d≤s×a÷d≤s×c÷bs \div d \le s \times a \div d \le s \times c \div b
所以M=s×c÷bs \times c \div b
显然s÷b≤s×c÷bs\div b \le s \times c \div b ,又由上面的结论得出
s×a÷d≤s×c÷bs \times a \div d \le s\times c \div b,
综上N≤MN \le M,也就是说i大臣要排在j大臣前面的条件为(设i大臣的左右手分别为a[i],b[i])a[i]×b[i]≤a[j]×b[j]a[i] \times b[i]\le a[j] \times b[j],最后因为数据太大,套上高精度。
给出大佬的代码参考。(题解版)
var s,ans,d:array[0..1100] of longint;a,b,c:array[0..1100] of longint;n:longint;procedure init;
var i,k:longint;
beginreadln(n);for i:=0 to n do beginreadln(a[i],b[i]);c[i]:=a[i]*b[i];end;while a[0]<>0 do begininc(s[0]);s[s[0]]:=a[0] mod 10000;a[0]:=a[0] div 10000;end;
end;procedure qsort(x,y:longint);
var i,j,mid,mi,t:longint;
begini:=x;j:=y;mid:=c[(x+y) shr 1];mi:=a[(x+y) shr 1];while i<j do beginwhile (c[i]<mid)or(c[i]=mid)and(a[i]<mi) do inc(i);while (c[j]>mid)or(c[j]=mid)and(a[j]>mi) do dec(j);if i<=j then begint:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t;t:=c[i];c[i]:=c[j];c[j]:=t;inc(i);dec(j);end;end;if i<y then qsort(i,y);if j>x then qsort(x,j);
end;procedure times(t:longint);
var i,g:longint;
beging:=0;for i:=1 to s[0] do begins[i]:=s[i]*t+g;g:=s[i] div 10000;s[i]:=s[i] mod 10000;end;s[s[0]+1]:=g;while s[s[0]+1]>0 do begininc(s[0]);s[s[0]]:=s[s[0]-1] div 10000+s[s[0]];s[s[0]-1]:=s[s[0]-1] mod 10000;end;
end;procedure divide(t:longint);
var g,i:longint;p:boolean;
beging:=0;for i:=s[0] downto 1 do begind[i]:=(s[i]+g*10000) div t;g:=(s[i]+g*10000) mod t;end;p:=false;for i:=s[0] downto 1 doif d[i]<>0 then beginp:=true;break;end;if p then d[0]:=i;p:=false;if d[0]>ans[0] then p:=true elseif d[0]<ans[0] then p:=false else beginfor i:=ans[0] downto 1 do beginif d[i]>ans[i] then beginp:=true;break;end;end;end;if p then ans:=d;
end;procedure main;
var i,ll:longint;
beginqsort(1,n);for i:=1 to n do begindivide(b[i]);times(a[i]);end;
end;procedure print;
var i,j:longint;sa:string;
beginwrite(ans[ans[0]]);for i:=ans[0]-1 downto 1 do beginstr(ans[i],sa);for j:=1 to 4-length(sa) do write(0);write(ans[i]);
end;
end;begininit;main;print;
end.
constmaxn=1000+5;maxv=1000000+5;
vara,b,c:array[-1..maxn] of longint;num:array[0..maxv] of longint;i,n,len:longint;
procedure swap(var a,b:longint);
vart:longint;
begint:=a;a:=b;b:=t;
end;
procedure qsort(x,y:longint);
vari,j,mid:longint;
begini:=x;j:=y;mid:=c[(i+j)>>1];repeatwhile c[i]<mid do inc(i);while c[j]>mid do dec(j);if i<=j thenbeginswap(a[i],a[j]);swap(b[i],b[j]);swap(c[i],c[j]);inc(i);dec(j);end;until i>j;if i<y then qsort(i,y);if x<j then qsort(x,j);
end;
procedure cheng(x:longint);
vari:longint;
beginfor i:=1 to len donum[i]:=num[i]*a[x];for i:=1 to len dobeginnum[i+1]:=num[i+1]+num[i] div 10;num[i]:=num[i] mod 10;end;inc(len);while num[len]>9 dobeginnum[len+1]:=num[len+1]+num[len] div 10;num[len]:=num[len] mod 10;inc(len);end;if num[len]=0 thendec(len);
end;
procedure chu;
vari:longint;
beginfor i:=len downto 1 dobeginnum[i-1]:=num[i-1]+(num[i] mod b[n])*10;num[i]:=num[i] div b[n];end;while num[len]=0 do dec(len);if len=0 thenwrite('1');
end;
begin{assign(input,'jzoj3100.in');reset(input);assign(output,'jzoj3100.out');rewrite(output);}readln(n);readln(a[0],b[0]);for i:=1 to n dobeginreadln(a[i],b[i]);c[i]:=a[i]*b[i];end;qsort(1,n);len:=1;num[1]:=a[0];for i:=1 to n-1 docheng(i);chu;for i:=len downto 1 dowrite(num[i]);{close(input);close(output);}
end.
目前oj最强版
const mo=10000000000;
var n,i,p,k,max:longint;ans:array[0..400] of int64;
beginreadln(n);ans[0]:=1;readln(ans[1]);for i:=1 to n dobeginreadln(p,k);if p*k>max then max:=p*k;ans[1]:=ans[1]*p;k:=0;while (ans[k+1]>0) or (k<ans[0]) dobegininc(k);ans[k+1]:=ans[k+1]*p+ans[k] div mo;ans[k]:=ans[k] mod mo;end;ans[0]:=k;end;for i:=ans[0] downto 2 dobeginans[i-1]:=ans[i-1]+ans[i] mod max*mo;ans[i]:=ans[i] div max;end;ans[1]:=ans[1] div max;while (ans[ans[0]]=0) and (ans[0]>1) do dec(ans[0]);if (ans[0]=1) and (ans[1]=0) then ans[1]:=1;write(ans[ans[0]]);for i:=ans[0]-1 downto 1 dobeginans[0]:=mo;while ans[0]>10 dobeginans[0]:=ans[0] div 10;if ans[i]<ans[0] then write(0);end;write(ans[i]);end;
end.
the end
thank you!
【NOIP2012DAY1】国王游戏相关推荐
- 【题解】P1080 国王游戏(贪心+高精python天下第一)
P1080 国王游戏 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排 ...
- 【贪心】国王游戏(ybtoj 贪心-1-4)
国王游戏 ybtoj 贪心-1-4 题目大意 有一个国王和n个大臣 每人左右手分别有一个数,现在然你对大臣们排列(国王在第一个) 每个大臣所得金币是前面的人左手上的数的积除以他右手上的数 现在问你获得 ...
- # 国王游戏(贪心+大数乘除+微扰法证明)
国王游戏(贪心+大数乘除+微扰法证明) 题意:n个大臣和一个国王,左右手都有一个数,排队,国王始终拍在最前面,每个大臣的奖励为这个大臣前面的人的左手上的数之积除以这个大臣右手上的数.构造最优队伍,使得 ...
- 洛谷P1080 国王游戏(贪心)
国王游戏 题目描述 恰逢 HHH 国国庆,国王邀请 nnn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nnn 位大臣排成 ...
- 国王游戏 [NOIP2012 提高组]
国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n位大臣排成一排,国王站在 ...
- 蓝桥云题库之国王游戏——Python满分解答
国王游戏 题目描述 输入描述 输出描述 输入输出样例 示例输入 示例输出 解题思路 从推测开始 尝试优化排序方法 整理思路 代码实现 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. ...
- 贪心算法——国王游戏
题目描述 孙悟空给花果山的小猴子们分桃子. 首先,他让每只小猴在左.右手上面分别写下一个整数,悟空自己也在左.右手上各写一个整数. 然后,让这 n 只小猴排成一排,悟空站在队伍的最前面. 排好队后,所 ...
- 做题记(4)P1080 国王游戏
今天,做了洛谷上的P1080 国王游戏,题目如下: 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整 ...
- NOIp2012D1T2 国王游戏 题解
国王游戏 洛谷P1080国王游戏 题解 这道题有个重要的性质:如果交换相邻两个大臣,获得金钱变化的有且只有这两个大臣.其余大臣得到的金钱不变. 我们考虑第 i i i个大臣和第 i + 1 i+1 i ...
- NOIP2012 国王游戏
2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...
最新文章
- TIOBE 5 月编程语言排行榜:Python、C++竞争白热化,Objective-C已沦为小众语言
- ES-PHP向ES批量添加文档报No alive nodes found in your cluster
- struts2 的struts.properties配置详解
- 报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm-GetEnv() return code = -2...
- 学好Java开发的关键七步
- 第十二届 2021年1月 蓝桥杯青少年组省赛C++组 第1题--第3题(python3实现)
- phpcms解决(sql数据库数据与页面显示结果)调用的栏目数据条数不一致问题 - 总结篇
- 命令前加./ ,在后台运行程序 linux批处理 linux自动运行程序
- FREERTOS 手册阅读笔记
- liang-Barskey算法
- Android Home键拦截
- 投资公募基金有哪些费用
- 取消Wince App 应用启动动画和隐藏分区注册表项
- AndroidStudio中Files under the “build“ folder are generated and should not be edited的解决方法
- 蜂蜜柚子茶最好的制作方法
- Linux安装软件无图形化界面,无图形界面安装 Development Tools(centos版)
- 一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora
- 腾讯云轻量应用服务器 CentOS7.6 +Tomcat/apache 搭建个人web项目,并允许外网通过80或8080端口访问【超详细】
- json格式数据有哪些特点
- 公众号对接电影票cps
热门文章
- (React-Native 学习之十 ) React-navigation 的使用:
- 【前端】1.学习了一段时间的vue,总结一下Vue书写规范
- 从一个资深面试官角度看Java面试:面试了20家大厂与面试了上百人之后,发现这样介绍项目经验,显得项目很牛逼!
- nginx配置日志记录问题
- 关于终身成长的几点感想
- OpenOffice在线预览文档
- MySQL 整体架构与 SQL 执行原理,数据库事务原理
- 知云文献翻译安装及使用教程
- 计算机二级报名时间2020年12月江苏省,2020年12月计算机二级考试报名时间及考试安排...
- 关于区块链的三个隐喻