题目描述

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

输入输出格式

输入格式:

第一行包含一个整数 n,表示大臣的人数。

第二行包含两个整数 a和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式:

输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

输入输出样例

输入样例#1:

3
1 1
2 3
7 4
4 6
输出样例#1:

2

说明

【输入输出样例说明】

按 1、2、3 号大臣这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 1、3、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 2、1、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 2、3、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9;

按 3、1、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 3、2、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9。

因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。

【数据范围】

对于 20%的数据,有 1≤ n≤ 10,0 < a、b < 8;

对于 40%的数据,有 1≤ n≤20,0 < a、b < 8;

对于 60%的数据,有 1≤ n≤100;

对于 60%的数据,保证答案不超过 10^9;

对于 100%的数据,有 1 ≤ n ≤1,000,0 < a、b < 10000。

NOIP 2012 提高组 第一天 第二题

首先相邻两个交换影响的答案只有它们两个

所以考虑让所有相邻的最优 假设 i,j (i+1=j),a[k]*a[1]*...*a[i-1]=S

则不交换顺序 与 交换顺序的答案(Max)分别为

max{S/b[i], S*a[i]/b[i]} -> max{1/b[i] , a[i]/b[j]} -> max{b[j]/b[i]b[j] , a[i]b[i]/b[i]b[j]}

max{S/b[j], S*a[j]/b[i]} -> max{1/b[j] , a[j]/b[i]} -> max{b[i]/b[i]b[j] , a[j]b[j]/b[i]b[j]} 两式比较

同去分母得 max{b[j] , a[i]b[i]} ? max{b[i] , a[j]b[j]}

设 a[i]*b[i] > a[j]*b[j]

显然 a[i]b[i] > b[j], a[j]b[j] > b[i] 则

两式比较 = a[i]*b[i] > a[j]*b[j]

所以 a[i]*b[i] > a[j]*b[j] 时,

不交换i,j会使答案更大

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,sum[],t[],ans[];
struct node{
int l,r,s;
bool operator < (const node &a) const {
return s<a.s;
}
}peo[];
bool judge() {
for(int i=;i<=t[];++i)
if(t[i]>ans[i]) return true;
else if(t[i]<ans[i])return false;
return false;
}
void mul(int x) {
int g=;
for(int i=;i<=sum[];++i) {
sum[i]=sum[i]*x+g;
g=sum[i]/;
sum[i]=sum[i]%;
}
while(g!=) {
++sum[];
sum[sum[]]=g%;
g/=;
}
}
void divv(int x) {
int num=;int k=sum[]+,s=;
memset(t,,sizeof(t));
while(num<x) {
--k;
num=num*+sum[k];
}
t[]=k;
for(;k>=;--k) {
t[++s]=num/x;
num=num%x*+sum[k-];
}
if(t[]>ans[]||t[]==ans[]&&judge()) {
ans[]=t[];
for (int i=;i<=t[];++i) ans[i]=t[i];
} }
int main () {
scanf("%d",&n);int a,b;
scanf("%d%d",&a,&b);
sum[]=a;sum[]=;ans[]=;ans[]=;
for(int i=;i<=n;++i) {
scanf("%d%d",&peo[i].l,&peo[i].r);
peo[i].s=peo[i].l*peo[i].r;
}
sort(peo+,peo+n+);
for(int i=;i<=n;++i) {
mul(peo[i].l);
divv(peo[i].l*peo[i].r);
}
for(int i=;i<=ans[];++i) printf("%d",ans[i]);
puts("");
return ;
}

最新文章

  1. Android SDK升级后报错error when loading the sdk 发现了元素 d:skin 开头无效内容
  2. Putty SSH简单使用
  3. Python的平凡之路(10)
  4. SLR,语法分析表的构建
  5. Oracle数据库生成UUID
  6. 安卓天天练练(四)drawable state 属性
  7. %s的用法
  8. Quartz.NET作业调度框架详解
  9. DELPHI 任务栏无EXE显示
  10. php和cookie
  11. 数据库中,char 与 varchar2 的区别
  12. 开涛spring3(2.2) - IoC 容器基本原理及其helloword
  13. 新版netkeeper开wifi无需路由器
  14. qssp2017 source
  15. dart实例
  16. AJAX-php-json数组
  17. iOS上的http请求:get、post以及同步、异步
  18. [NOI2018]归程 kruskal重构树
  19. springmvc+mybatis 处理图片(二):显示图片
  20. C++ 类型转换的特殊用法

热门文章

  1. c++ 计算彩票中奖概率
  2. 学习笔记(_huaji_)
  3. linux 04 CentOS安装
  4. perl学习一:探索Perl世界
  5. Day11名称空间,作用域,闭包函数
  6. 【01】git下载和安装的完整过程
  7. luogu2050 [NOI2012]美食节
  8. Java 正则表达式详解---https://www.jb51.net/article/16829.htm
  9. pytorch使用过程中遇到的一些问题
  10. WCF学习-协议绑定