题目描述

恰逢 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%的数据,保证答案不超过 109;

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

NOIP 2012 提高组 第一天 第二题

经过凭感觉瞎搞大堆复杂的证明和推导,以每个人左手右手的乘积为标准,从小到大排序,然后从左往右乘起来,求在哪个位置可以取得最大值即可。

需要用到高精度。

↑高精度简直恶心,调了好久好久才对。

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct HN{
int a[];
int len;
}num,c,ans;
bool cmp(HN a,HN b){
if(a.len<b.len)return ;
for(int i=a.len;i;--i){
if(a.a[i]<b.a[i])return ;
if(a.a[i]>b.a[i])return ;
}
return ;
}
void N_mul(int x){
HN t;t.len=num.len+;
memset(t.a,,sizeof t.a);
for(int i=;i<=num.len;i++){
t.a[i]+=num.a[i]*x;
t.a[i+]=t.a[i]/;
t.a[i]%=;
}
// num.len+=10;
while(t.a[t.len]== && t.len>) t.len--;
num=t;
return;
}
void N_div(int x){
memset(c.a,,sizeof c.a);
int tmp=;
c.len=;
for(int i=num.len;i;i--){
tmp=*tmp+num.a[i];
if(tmp>=x){
if(!c.len) c.len=i;
c.a[i]=tmp/x;
tmp%=x;
}
}
return;
}
void PRI(HN num){
printf("%d",num.a[num.len]);
for(int i=num.len-;i>;--i){
printf("%d",num.a[i]/);
printf("%d",num.a[i]/%);
printf("%d",num.a[i]/%);
printf("%d",num.a[i]%);
}
printf("\n");
return;
}
//
struct node{
int a,b;
int c;
}m[];
void qsort(int l,int r){
if(l<r){
int i=l,j=r; node x=m[l];
while(i<j){
while(i<j && m[j].c>=x.c) j--;
m[i]=m[j];
while(i<j && m[i].c<=x.c) i++;
m[j]=m[i];
}
m[i]=x;
qsort(l,i-);
qsort(i+,r);
}
return;
}
int n;
int main(){
n=read();
scanf("%d",&num.a[]);
scanf("%d",&num.len);
num.len=;
int i,j;
for(i=;i<=n;i++){
m[i].a=read();
m[i].b=read();
m[i].c=m[i].a*m[i].b;
}
qsort(,n);
// for(i=1;i<=n;i++)printf("%d ",m[i].c);printf("\n");
// for(i=1;i<=n;i++)printf("re:%d %d\n",m[i].a,m[i].b);
ans.len=;
ans.a[]=;
for(i=;i<=n;i++){
N_div(m[i].b);
// PRI(c);
if(cmp(ans,c))ans=c;
// PRI(ans);
// printf("num:");PRI(num);
N_mul(m[i].a);
}
PRI(ans);
return ;
}

[NOIP2012] 提高组 洛谷P1080 国王游戏的更多相关文章

  1. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  2. 【题解】洛谷 P1080 国王游戏

    目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...

  3. 洛谷 P1080 国王游戏

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

  4. 洛谷—— P1080 国王游戏

    https://www.luogu.org/problem/show?pid=1080 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整 ...

  5. 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序

    洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...

  6. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  7. [NOIP2011] 提高组 洛谷P1312 Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  8. [NOIP2012] 提高组 洛谷P1084 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  9. [NOIP2012] 提高组 洛谷P1083 借教室

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

随机推荐

  1. NOI2018准备Day4

    上午9点20至11点50就做出了一道题,一个很基础的二分挡住了,原因是浮点数精度问题的处理,现在还搞不懂,为什么用double存进去两位小数过不了,用double存进去两位小数再*100再/100就能 ...

  2. ZooKeeper 笔记(4) 实战应用之【消除单点故障】

    关键节点的单点故障(Single Point of Failure)在大型的架构中,往往是致命的.比如:SOA架构中,服务注册中心(Server Register)统一调度所有服务,如果这个节点挂了, ...

  3. java:集合的自定义多重排序

    问题: 有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是 ...

  4. Android之捕获TextView超链接

    应该是好久没有写有关技术类的文章了,今天分享一篇捕获TextView超链接的文章,希望对大家有所帮助,我终于在歪路上回归正途了.这个捕获TextView超链接应该算是比较常用吧,如果你会了,就不用看了 ...

  5. 异步dcfifo的读写

    异步dcfifo的原理 Dcfifo即是Double clk fifo,意思是双时钟的fifo.或许你现在还不知道什么是fifo,那我就先从fifo(就是同步fifo,不过同步fifo在实际运用中比较 ...

  6. NetFPGA

    From Wikipedia, the free encyclopedia The NetFPGA project[1] is an effort to develop open source har ...

  7. ubuntu mysql远程登录设置

    1:打开命令终端:vim /etc/mysql/my.cnf 并找到bind-address = 127.0.0.1这行 注释掉这行,如:#bind-address = 127.0.0.1,即在前面加 ...

  8. 【URAL 1486】Equal Squares

    题意:求给定字符矩阵中相同正方形矩阵的最大边长和这两个相同正方形的位置 第一次写字符串哈希,选两个不同的模数进行二维字符串哈希. 本来应该取模判断相等后再暴力扫矩阵来判断,但是我看到<Hash在 ...

  9. hdu 4612 强连通

    题意:有一些联通的地方,如果2点间只有一条路径,这样的边叫做桥,现在让你添加一个桥,使最后的桥最少,问最少的桥使多少? 先求一次强连通分量,然后图就分成了几个块,将这几个块看做点,求出总共有多少条重建 ...

  10. js-比较两个日期的大小

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...