国王游戏

题目描述:

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

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

输入格式:

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

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

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

输出格式:

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

样例输入:

3
1 1
2 3
7 4
4 6

样例输出:

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。

时间限制:1000ms
空间限制:256MByte


来源:NOIP2012提高t2

初看此题,居然没有第一时间反应过来这居然是贪心(只是想练练高精而已TAT),结果想了好久才发现可以贪❤,然后加个高精乘除比较就好了。

下面证明一下贪心的正确性:

  我们设第i个大臣左手是a[ i ] , 右手是b[ i ] , w[i]代表a[ 1 ]  *  a[ 2 ]  *  a[ 3 ]  * ... *  a[ i ]  , val[ i ] 代表这第i个大臣可以获得的钱数;

  不难发现 , val [ i ] = w[ i - 1 ]  /  b [ i ]   ,   val [ i + 1 ] = w[ i ] / b [ i + 1 ];

   应为w[ i ]  =  w [ i - 1 ] * a [ i ];

   所以  val [ i + 1 ] = w[ i ] / b [ i + 1 ]  =  w [ i - 1 ] * a [ i ] / b [ i + 1 ];

  将这两条式子相除

   val [ i ] = w[ i - 1 ]  /  b [ i ] ;

  val [ i + 1 ] = w[ i ] / b [ i + 1 ]  =  w [ i - 1 ] * a [ i ] / b [ i + 1 ];

  得到:    val [ i ] / val[ i + 1 ] = b [ i + 1 ] / (b [ i ] * a [ i ]);

  移项得到:   val[ i + 1]  =  a [ i ] * b [ i ] * val [ i ] / b[ i + 1 ];

  应为b[ i + 1 ]是固定的,所以val[ i + 1]的大小只和a [ i ] * b [ i ] * val [ i ]有关系;

  现在考虑让val[ i + 1 ] 最小,应为前面i个已知,所以val[ i ]是确定的。

  所以为了让val[ i + 1 ]最小,就要让a[ i ] * b[ i ]小;

  所以只要在(1 ~ i)之间用a[ i ] * b[ i ]排序就好啦;

  推广到整个队列就也这样排序;

#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<algorithm>
#define ll long long
#define _ 8
#define mod 100000000
#define maxn 10050
using namespace std; struct bg{
ll v[maxn];
int size;
bg(){
memset(v,,sizeof(v));
}
}; struct st{
int a,b;
ll val;
}s[maxn]; bool com(st a , st b)
{
return a.val < b.val;
} inline bool operator <(bg a , bg b)
{
if(a.size < b.size) return ;
if(a.size > b.size) return ;
for(int i=a.size;i>=;i--)
{
if(a.v[i] < b.v[i]) return ;
if(a.v[i] > b.v[i]) return ;
}
return ;
} inline ostream& operator <<(ostream &os , bg x)
{
ll i;
os << x.v[x.size];
for(int i=x.size - ;i;i--)
os << setfill('') << setw(_) << x.v[i];
return os;
} inline bg operator *(bg a , ll b)
{
for(int i=;i<=a.size;i++) a.v[i] *= b;
ll jin = ;
for(int i=;i<=a.size;i++)
{
a.v[i] += jin;
jin = a.v[i] / mod;
a.v[i] %= mod;
}
while(jin)
{
a.v[++a.size] = jin % mod;
jin /= mod;
}
return a;
} inline bg operator /(bg a , ll b)
{
ll rest = , pos = a.size , len = a.size;
while(rest < b && pos)
{
rest = rest * mod + a.v[pos];
pos--;
}
pos++;
bg c;
if(pos == && rest < b) return c;
c.size = pos;
while(pos)
{
c.v[pos] = rest / b;
rest %= b;
pos--;
rest = rest * mod + a.v[pos];
}
if(!c.v[c.size]) c.size--;
return c;
} int n; bg ans,ma; int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&s[i].a,&s[i].b),s[i].val = s[i].a * s[i].b;
sort(s+,s++n,com);
ans.size = ;
ans.v[] = ;
ans = ans * s[].a;
for(int i=;i<=n;i++)
{
if(ma < (ans / s[i].b)) ma = (ans / s[i].b);
ans = ans * s[i].a;
}
cout << ma <<endl;
}

  

继续写高精!noip2012国王游戏。。。的更多相关文章

  1. [贪心][高精]P1080 国王游戏(整合)

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

  2. NOIP2012国王游戏

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

  3. NOIP2012 国王游戏

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

  4. C++中,用类和重载运算符写高精模板

    先放代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; s ...

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

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

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

    题目描述 恰逢 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. Tomcat/weblogic session失效时间的几种设置方法

    一.在容器中设置tomcat中配置server.xml中定义context时采用如下定义: <Context path="/livsorder" docBase=" ...

  2. 阿里云ipv6安全组匹配所有ip的方法

    IPv4和IPv6通信彼此独立.您需要为ECS实例单独配置IPv6安全组规则. 操作步骤 登录ECS控制台. 在左侧导航栏,单击网络和安全 > 安全组. 找到目标安全组,然后单击配置规则. 单击 ...

  3. DT时代,企业更需构建精准数据分析体系

    DT时代,企业更需构建精准数据分析体系 随着互联网的飞速发展,信息的传输日益方便快捷,需求也日益突出,纵观整个互联网领域,大数据已被认为是继云计算.物联网之后的又一大颠覆性的技术性革命,毋庸置疑,大数 ...

  4. create-react-app 创建react应用环境变量(env)配置

    参考:https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables What other . ...

  5. 【MM系列】SAP MM中物料帐下修改物料的价格

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 物料帐下修改物料的价格   ...

  6. 数论-欧拉函数-LightOJ - 1370

    我是知道φ(n)=n-1,n为质数  的,然后给的样例在纸上一算,嗯,好像是找往上最近的质数就行了,而且有些合数的欧拉函数值还会比比它小一点的质数的欧拉函数值要小,所以坚定了往上找最近的质数的决心—— ...

  7. hdu-4289.control(最小割 + 拆点)

    Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. spring注解之@Scope

    转自:https://blog.51cto.com/4247649/2118351 作者:知了123 主要从以下几方面来介绍一下@Scope注解 @Scope注解是什么 @Scope注解怎么使用 @S ...

  9. 动画可以暂停animation-play-state

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. node中使用log4js4.x版本记录

    const log4js = require('log4js'); log4js.configure({ appenders: { logFile: { //文件形式打印日志 type: " ...