国王游戏

题目描述:

恰逢 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. 关于 token

    用户在浏览器做一系列操作,后台服务怎么判断这些操作是来自同一个用户? 1. seesion 用户登录后,后台生成 sessionid 返回给浏览器,浏览器的每次请求带上 sessionid,后台关联 ...

  2. 快速入门分布式消息队列之 RabbitMQ(1)

    目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...

  3. 抓包工具之—charles碎言碎语

    一.Charles常见使用场景: 1.Charles是跨平台的抓包工具,支持Windows,mac或Linux平台: 2.获取请求信息.测试接口时,若接口文档中的参数不清楚或没有接口文档时,可以通过抓 ...

  4. vue组件父子间通信之综合练习--假的聊天室

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

  5. Linux-部署ftp

    通过外部window ftp 客户端 访问linux 有两种方法 方法一:Linux系统未安装vsftp 服务 这个是本人使用的ftp客户端的版本号 启动ftp客户端,填写ip ,账号,密码 问题:当 ...

  6. PYTHON2.7之前需要独立安装pip

    如果python2版本是>=2.7.9, python3版本是>=3.4, pip已将一起随python安装成功了. 对于Python 2.6,你需要更旧setuptools.适用于Pyt ...

  7. 一些输出、处理细节&注意点

    https://blog.csdn.net/qq_41071646/article/details/79953476 输出百分比的时候,结果需要加上一个EPS(1e-6)四舍五入保证精度. 卡精度—— ...

  8. rac节点挂掉后,vip飘到别的节点,但是业务连接不上报 no listener问题处理

    客户一套rac系统,三节点,其中一个节点的p260主机主板有问题(经常机器重启,好像是这个型号的通病,主板被炒到20W),临时把故障节点的vip作为业务地址用. 首先,查看确定故障节点vip飘到那个节 ...

  9. Vue 基础 day04

    什么是路由 后端路由: 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器的资源: 前端路由: 对于单页面应用程序来说,主要是通过URL中的hash(#)来实现不同页面之间的跳转 ...

  10. Java web 加载过程

    1.Web容器初始化过程 2.SpringMVC中web.xml配置 3.认识ServletContextListener 4.认识ContextLoaderListener 5.Dispatcher ...