题目大意:

  n个人排成一排,排头固定,其他可以变。每一个人左右手都有一个整数,一个人的分数为他所有前面的人左手上的数的乘积除以他右手上的数(向下取整),求在整列中最大分数的最小值。

思路:

  首先,一切序列都可以通过若干次相邻的人的交换实现转换,而相邻的人的交换只会影响这两个人的分数。

  假设相邻的两人为i,i+1,则令a[i]*b[i]<=a[i+1]*b[i+1],设i之前的和为S,则交换前的ans1=max{S/b[i],S*a[i]/b[i+1]},交换后ans2=max{S/b[i+1],S*a[i+1]/b[i]}。∵a[i],a[i+1],b[i],b[i+1],S均为正整数,∴S*a[i]>=S,∴S*a[i]/b[i+1]>=S/b[i+1]。

同理:S*a[i+1]/b[i]>=S/b[i]。

又∵a[i]*b[i]<=a[i+1]*b[i+1]且a[i],a[i+1],b[i],b[i+1],S均为正整数,∴S*a[i]*b[i]<=S*a[i+1]*b[i+1],∴S*a[i]/b[i+1]<=S*a[i+1]/b[i],∴ans2>=ans1,∴要使最终ans最小则要使每个人左右手的数的乘积从小到大排列,在计算答案。

  由于数据较大,需要用到高精度(压位),乘法没什么问题,除法注意边界条件!

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=,N=;
int n,i,l,p,len,a[M],b[M],c[M],s[M],d[M],z[M],id[M],ans[M]; bool cmp(int x,int y) { return s[x]<s[y]; } void cheng(int x)
{
int i,t=;
for (i=;i<=len;++i)
{
c[i]=t+c[i]*x;
t=c[i]/N;
c[i]=c[i]%N;
}
if (t) c[++len]=t;
} bool pd()
{
if (l>p) return ;
for (int i=;i<=l;i++)
if (ans[i]<d[i]) return ;
return ;
} void chu(int y)
{
int i=len,t,x=z[len];
for (l=;i;)
{
if (i>) { if (x<y) x=x*N+z[--i]; } else break;
d[++l]=x/y;x=x%y;
}
if (x>=y) d[++l]=x/y;
if (pd()) for (p=l,i=;i<=l;i++) ans[i]=d[i];
} int main()
{
scanf("%d%d%d",&n,&a[],&b[]);
for (i=;i<=n;i++) scanf("%d%d",&a[i],&b[i]),s[i]=a[i]*b[i],id[i]=i;
sort(id+,id++n,cmp); c[len=]=a[];
for (i=;i<=n;i++) memcpy(z,c,sizeof c),chu(b[id[i]]),cheng(a[id[i]]);
printf("%d",ans[]);
for (i=;i<=p;i++)//printf("%05d",ans[i]);
if (ans[i]>) printf("%d",ans[i]);
else if (ans[i]>) printf("0%d",ans[i]);
else if (ans[i]>) printf("00%d",ans[i]);
else if (ans[i]>) printf("000%d",ans[i]);
else printf("0000%d",ans[i]);
return ;
}

[NOIP2012]国王游戏 题解的更多相关文章

  1. luoguP1080 国王游戏 题解(NOIP2012)(贪心+高精)

    luoguP1080 国王游戏 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

  2. 继续写高精!noip2012国王游戏。。。

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

  3. NOIP2012 国王游戏

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

  4. [noip2012]国王游戏<贪心+高精度>

    题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...

  5. NOIP2012国王游戏(60分题解)

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

  6. NOIP2012国王游戏

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

  7. [NOIp2012] 国王游戏(排序 + 贪心 + 高精度)

    题意 给你两个长为 \(n+1\) 的数组 \(a,b\) ,你需要定义一个顺序 \(p\) (\(p_0\) 永远为 \(0\)) 能够最小化 \[ \max_{i=1}^{n} \frac{\pr ...

  8. 洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度

    题目:https://www.luogu.org/problemnew/show/P1080 排序方法的确定,只需任取两个人,通过比较与推导,可以得出ai*bi小的人排在前面: 高精度写的时候犯了些细 ...

  9. Luogu P1080 [NOIP2012]国王游戏

    题目 按\(a_i*b_i\)升序排序即可. 证明考虑交换法. 对于排序后相邻的两个人\(i,j(a_ib_i\le a_jb_j)\),设前面的总的积为\(s\),则当前答案为\(\max(\fra ...

随机推荐

  1. CentOS Linux解决Device eth0 does not seem to be present

    在VMware里克隆出来的Centos Linux.. ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: 解决办法: 首先,打开/etc/udev/rules.d/70 ...

  2. 深入理解javascript原型和闭包(14)——从【自由变量】到【作用域链】

    先解释一下什么是“自由变量”. 在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量.如下图 如上程序中,在调用fn()函数时,函数体中第6 ...

  3. Ruby常用比较操作符

    操作符 含义 == 测试值是否相等 ==== 用来比较case语句的目标和每个when从句的项 <=>  通用比较操作符. 根据接受者小于, 等于, 大于其参数, 返回-1, 0. 1 & ...

  4. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  5. $_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]

    1.$_SERVER["SCRIPT_NAME"] 说明:包含当前脚本的路径 2.$_SERVER["PHP_SELF"] 说明:当前正在执行脚本的文件名 3. ...

  6. debug [LTS]

    0613 A. 复制代码的时候忘了后续的对称的修改. 统计答案时出现了一些不可理喻的低级失误. B. 在0-indexed的程序中访问第一个元素使用了Arr[1]. Matrix-tree为mat[d ...

  7. HTML div 滚动条样式设计

    ::-webkit-scrollbar-track-piece{ background-color:#fff;/*滚动条的背景颜色*/ -webkit-border-radius:0;/*滚动条的圆角 ...

  8. vmware12 ubuntu14.01桥接模式静态IP上网

    一家之言,希望能帮你解决问题.此处更多为我自留备忘. 环境: win7:机安装支持桥接模式的服务. vmware12 ubutu 14.01 注意事项(此处坑多): 1.networking rest ...

  9. java13

    1:登录注册案例(理解) 2:Set集合(理解) (1)Set集合的特点 无序,唯一 (2)HashSet集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法: ...

  10. linux编程问题记录

    1.程序中需要用到字符串的时候,尽可能选择string类型,这种类型的字符串有很多比较容易的功能,如字符串之间可以直接拷贝赋值 string a; string b="123"; ...