题目

恰逢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】国王游戏相关推荐

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

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

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

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

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

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

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

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

  5. 国王游戏 [NOIP2012 提高组]

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

  6. 蓝桥云题库之国王游戏——Python满分解答

    国王游戏 题目描述 输入描述 输出描述 输入输出样例 示例输入 示例输出 解题思路 从推测开始 尝试优化排序方法 整理思路 代码实现 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. ...

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

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

  8. 做题记(4)P1080 国王游戏

    今天,做了洛谷上的P1080 国王游戏,题目如下: 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整 ...

  9. NOIp2012D1T2 国王游戏 题解

    国王游戏 洛谷P1080国王游戏 题解 这道题有个重要的性质:如果交换相邻两个大臣,获得金钱变化的有且只有这两个大臣.其余大臣得到的金钱不变. 我们考虑第 i i i个大臣和第 i + 1 i+1 i ...

  10. NOIP2012 国王游戏

    2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...

最新文章

  1. usaco Feed Ratios
  2. Clion从入门到精通
  3. python使用字典格式化字符串-Python字符串格式方式 %s format()
  4. javascript一句话技巧
  5. python xlwt xlrd 写入一行_Python Excel文件的读写操作(xlwt xlrd xlsxwriter)
  6. dynamic的使用
  7. 翻译专业资格(水平)考试介绍
  8. 我的网站心得之缓存技术(前端篇)
  9. 牛顿迭代法 解 二元高次方程组 Mathematica
  10. HDU 4598 Difference
  11. background-clip和background-origin
  12. 虚拟机磁盘重新分区增加Docker磁盘空间
  13. 【2021届网易游戏-游戏测试开发实习生面经】笔试+一面+二面+HR面(已转正)
  14. Flutter 跨平台框架应用实战-2019极光开发者大会
  15. 为什么你要拒绝我(苹果AppStore被拒理由大全)
  16. ubuntu16.04对SD卡进行分区
  17. 电大 专科 计算机应用,2015春中央电大计算机应用基础(专科)平时作业(3)
  18. 案例 02、OpenGL入门--正方形键位控制
  19. 并发控制- sched_yield 函数
  20. 肩部三角肌介绍:肌肉英文名称和图示

热门文章

  1. Hank的无线802.11学习笔记--2
  2. 互联网运营平台指标体系_分享 :滴滴数据仓库指标体系建设实践
  3. 鄭光弼 守夫 當坐吾座
  4. centos GPU tensorflow pytorch 深度学习 环境搭建
  5. 常用的技术网站(一)
  6. 一个能测试怀孕的软件,四个方法测怀孕 准爆了
  7. 你的金钱和时间流向哪,你的人生就什么样!
  8. 远程访问操作mysql数据库
  9. Java实现一个单号生成工具类
  10. 信息安全实训周——五月四日学习记录