【题意】

恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右

手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这n位大臣排

成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每

位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右

手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,

使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

【算法】贪心(排序)+高精度

【题解】这是少数不用二分解决最大值最小化问题的题。

我们考虑将所有大臣按某种条件排序,从而满足该顺序最优。

考虑当前已有排序,其中某两位置是a1,b1和a2,b2,交换两个位置不能使答案最优需要满足的条件。

显然交换两位置对前后都没有影响,假设Σai=s,所以交换后不能使答案最优须满足:

$$max(\frac{s}{b_1},\frac{sa_1}{b_2})<max(\frac{s}{b_2},\frac{sa_2}{b_1})$$

将s提出来,

$$max(\frac{1}{b_1},\frac{a_1}{b_2})<max(\frac{1}{b_2},\frac{a_2}{b_1})$$

由于ai是正整数,故我们已知:

$$\frac{1}{b_1}<\frac{a_2}{b_1} \ \ ,\ \ \frac{1}{b_2}<\frac{a_1}{b_2}$$

所以条件转化为:

$$\frac{a_1}{b_2}<\frac{a_2}{b_1}$$

即:

$$a_1b_1<a_2b_2$$

所以只要按aibi从小到大排序,一定最优。

为了找到适合排序的关键字,我们考虑某两位的交换会使排序更优的条件即可得知。

答案最大可以达到10000^1000即10^4000,要用高精度。(这是NOIP最后一次考高精度,以后不可能再考了)

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,maxlen=;
struct cyc{int a,b,c;}a[maxn];
int n,lens,x,lmax,lena;
int sum[maxlen],ans[maxlen],maxs[maxlen];
bool cmp(cyc a,cyc b)
{return a.c<b.c;}
void cheng(int numi)
{
int num=a[numi].a;x=;
for(int i=;i<=lens;i++)
{
x+=sum[i]*num;
sum[i]=x%;
x/=;
}
while(x>)sum[++lens]=x%,x/=;
// printf("1...%d * lens=%d\n",numi,lens);
// for(int i=1;i<=lens;i++)printf("%d",sum[i]);printf("\n");
}
void divs(int numi)
{
int num=a[numi].b;x=;
for(int i=lens;i>=;i--)
{
x=x*+sum[i];
ans[i]=x/num;
x%=num;
}
lena=lens;
while(ans[lena]==&&lena>)lena--;
// printf("1...%d-1/%d / lens=%d\n",numi,numi,lena);
// for(int i=1;i<=lena;i++)printf("%d",ans[i]);printf("\n");
bool f=;
if(lena>lmax)f=;else if(lena<lmax)f=;else
for(int i=lena;i>=;i--)
if(ans[i]>maxs[i]){f=;break;}else if(ans[i]<maxs[i]){f=;break;}
if(!f)
{
for(int i=;i<=lena;i++)maxs[i]=ans[i];
lmax=lena;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n+;i++)scanf("%d%d",&a[i].a,&a[i].b),a[i].c=a[i].a*a[i].b;
sort(a+,a+n+,cmp);//for(int i=1;i<=n+1;i++)printf("%d %d\n",a[i].a,a[i].b);
sum[(lens=)]=;cheng();maxs[(lmax=)]=;
for(int i=;i<=n+;i++)divs(i),cheng(i);
for(int i=lmax;i>=;i--)printf("%d",maxs[i]);
return ;
}

【NOIP】提高组2012 国王游戏的更多相关文章

  1. 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

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

  2. 「洛谷P1080」「NOIP2012提高组」国王游戏 解题报告

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

  3. 【noip2012提高组】国王游戏

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

  4. noip提高组2011 Mayan游戏

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

  5. ⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】

    感想 真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来. 重构代码千万遍,依旧只有-1输出. 正解 非常明显的一道搜索题目. 每一次记录上一级的状态,这样实现比较不容易出错. 然后考虑剪枝: ...

  6. luogu P1038借教室【Noip提高组2012】

    这道题我读完题目的第一感觉是: 这不就是个线段树??用线段树维护区间最小值,检查是否满足订单要求即可判断. 对于修改操作直接在区间上进行. 据说会卡一卡线段树,但是貌似写一个懒标记,连zkw线段树都不 ...

  7. 【NOIP2012提高组】国王游戏 贪心 + 高精度

    题目分析 题目答案不具有单调性,所以不可以二分,转而思考贪心.因为无法确定位置,所以考虑如何才能让对于每一个$1 ~ i$使得$i$的答案最大,即$1 ~ i$最后一个最优.若设对于位置$i$,$a[ ...

  8. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

  9. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

随机推荐

  1. Java中的线程的优先级

    Java 中线程优先级简介: 1. Java 提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程. 按照线程的优先级决定应该调度哪个线程来执行. 2. 线程的优先级用数字表示, 范围从 1 到 ...

  2. lintcode-31-数组划分

    数组划分 给出一个整数数组 nums 和一个整数 k.划分数组(即移动数组 nums 中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置 ...

  3. C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

    首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不 ...

  4. 【bzoj4921】[Lydsy六月月赛]互质序列 暴力

    题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...

  5. 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...

  6. c# 日志记录 行号

    Console.WriteLine(ex.Message); //通过如下代码来记录异常详细的信息 ); Console.WriteLine("文件名:{0},行号:{1},列号:{2}&q ...

  7. BZOJ1499:[NOI2005]瑰丽华尔兹——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1499 舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地.钢琴可以在空地上滑 ...

  8. 51NOD 1038:X^A Mod P——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1038 X^A mod P = B,其中P为质数.给出P和A B,求< ...

  9. 关于Javac编译器的那点事(一)

    Javac是什么? 它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码.而Java字节码,说白了就是一连串二进制数字. J ...

  10. poj:1850 Code(组合数学?数位dp!)

    题目大意:字符的字典序依次递增才是合法的字符串,将字符串依次标号如:a-1 b-2 ... z-26 ab-27 bc-52. 为什么题解都是组合数学的...我觉得数位dp很好写啊(逃 f[pos][ ...