题意:

  让n 位大臣排成一排,国王站在队伍的最前面。

  排好队后,所有的大臣都会获得国王奖赏的若干金币,

  每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

  求一种排列顺序,使得得到金币最大的大臣得到的金币最少

  输出最小值

先举个简单的锤子

n=2

有两种情况

  左手 右手
国王 $a_0$ $b_0$
大臣1 $a_1$ $b_1$
大臣2 $a_2$ $b_2$

可以计算得出$ans_1=max(\frac{a_0}{b_1},\frac{a_0*a_1}{b_2})$

  左手 右手
国王 $a_0$ $b_0$
大臣1 $a_2$ $b_2$
大臣2 $a_1$ $b_1$

可以计算得出$ans_2=max(\frac{a_0}{b_2},\frac{a_0*a_2}{b_1})$

对比两种情况的答案

$ans_1=max(\frac{a_0}{b_1},\frac{a_0*a_1}{b_2})$

$ans_2=max(\frac{a_0}{b_2},\frac{a_0*a_2}{b_1})$

分别设$k_1,k_2,k_3,k_4$ 对应代表上边的值

$ans_1=max(k_1,k_2)$

$ans_2=max(k_3,k_4)$

分母相同,分子大的大

因此

$k_2>k_3$

$k_4>k_1$

不妨设$ans_1<ans_2$

即$k_2<k_4$

也就是$\frac{a_0*a_1}{b_2}<\frac{a_0*a_2}{b_1}$

移个项,可得出

$a_1*b_1<a_2*b_2$
所以,当 $a_1*b_1<a_2*b_2$时,$ans_1<ans_2$

所以为了求出ans最小值

按l*r进行排序

注意要用高精!

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define int long long
#define olinr return
#define _ 0
#define love_nmr 0
#define DB double
struct zhi_zhang_gao_jing_qu_si
{
int w[];
int len;
int &operator [] (int a)
{
return w[a];
}
zhi_zhang_gao_jing_qu_si()
{
memset(w,,sizeof w);
len=;
w[]=;
}
friend zhi_zhang_gao_jing_qu_si operator * (zhi_zhang_gao_jing_qu_si &a,int b)
{
zhi_zhang_gao_jing_qu_si t;
t.w[]=;
t.len=a.len+;
for(int i=;i<=t.len;i++)
{
t.w[i]+=a.w[i]*b;
t.w[i+]=t.w[i]/;
t.w[i]%=;
}
while(t.len>&&t.w[t.len]==) t.len--;
return t;
}
friend zhi_zhang_gao_jing_qu_si operator / (const zhi_zhang_gao_jing_qu_si &a,int b)
{
zhi_zhang_gao_jing_qu_si t;
t.len=a.len;
int x=;
for(int i=t.len;i>=;i--)
{
t.w[i]=(x*+a.w[i])/b;
x=(x*+a.w[i])%b;
}
while(t.len>&&t.w[t.len]==) t.len--;
return t;
}
friend bool operator < (const zhi_zhang_gao_jing_qu_si &a,const zhi_zhang_gao_jing_qu_si &b)
{
if(a.len>b.len) return false;
if(a.len<b.len) return true;
for(int i=a.len;i>=;i--)
{
if(a.w[i]<b.w[i]) return true;
if(a.w[i]>b.w[i]) return false;
}
return true;
}
void out()
{
for(int i=len;i>=;i--)
putchar(w[i]+'');
}
};
struct node
{
int l,r;
friend bool operator < (const node &a,const node &b)
{
return a.l*a.r<b.l*b.r;
}
}p[];
int n;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return x*f;
}
signed main()
{
n=read();
n++;
for(int i=;i<=n;i++)
{
p[i].l=read();
p[i].r=read();
}
sort(p+,p+n+);
zhi_zhang_gao_jing_qu_si sm;
zhi_zhang_gao_jing_qu_si ans;
for(int i=;i<=n-;i++)
{
sm=sm*p[i].l;
ans=max(ans,sm/p[i+].r);
}
ans.out();
olinr ~~(^_^)+love_nmr;
}

P1080 国王游戏的更多相关文章

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

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

  2. P1080 国王游戏 (等待高精度AC)

    P1080 国王游戏 题解 贪心策略:按照大臣左右手数字乘积从小到大排序 假设我们已经把大臣排了一个顺序 假定在这个顺序下我们可以保证  得到奖赏最多的大臣所得奖赏最少 那么我们一旦交换任意两个大臣, ...

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

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

  4. Luogu P1080国王游戏(贪心)

    国王游戏 题目链接:国王游戏 ps:题目数据说明了要写高精度. 这个题的答案是\(a.l * a.r < b.l * b.r\)按照这个进行排序 题解中大部分只是如何证明排序是: \(a.l * ...

  5. [NOIP2012] 提高组 洛谷P1080 国王游戏

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

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

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

  7. P1080 国王游戏 贪心 高精度

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

  8. 洛谷 P1080 国王游戏

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

  9. luogu P1080 国王游戏

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

  10. 洛谷—— P1080 国王游戏

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

随机推荐

  1. IT求职经验分享

    本来这些东西应该早点写出来,之前由于一些事情的顾虑迟迟没有发表下笔整理并发表出来.最近及接下来的日子是校招找工作的关键时期,结合自己之前找暑期实习的过程及笔试面试经历(主要是三家,腾讯.360.绿盟科 ...

  2. jackson 进行json与java对象转换 之四

    jackson简单使用,对象转json,json转对象,json转list   POJO序列化为json字符串: 准备一个POJO: @JsonIgnoreProperties(ignoreUnkno ...

  3. Python 标准库 -> Pprint 模块 -> 用于打印 Python 数据结构

    使用 pprint 模块 pprint 模块( pretty printer ) 用于打印 Python 数据结构. 当你在命令行下打印特定数据结构时你会发现它很有用(输出格式比较整齐, 便于阅读). ...

  4. LAMP 2.3 Apache配置防盗链

    如果你的站点是一个图片站,有很多非常漂亮的美女图片,那我相信,时间久了会有很多人来你网站借图片,有的人直接下载走了,还有的人直接取走图片的地址,比如你的网站域名是 www.123.com,图片地址为 ...

  5. 使用Ping命令解析主机名解析出来的是IPv6

    如果你经常使用ping命令,并身处局域网,那么你肯定会有这样一个疑问:Ping计算机名为何是IPv6地址? 问这个问题的人很少见,大多都是对网络知识稍有了解的人,所以才会闻到关于ping的问题,而且在 ...

  6. 环境变量,include搜索路径,lib库搜索路径

    环境变量 系统环境变量 我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解.其实我们在windows中经常容易接触.其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web. ...

  7. SQL 连贯操作 [1]

    一. 连贯入门 查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两位. 在 Home/controller/UserController.class.php 下插入 1.连贯操作入门 $us ...

  8. 简单好用的General开发框架

    1.开篇概述 从2004年学习编程,2007年学习C#以来,做的多半都是跟数据库打交道的工作,所以也积累了很多数据库方面的知识,用过一些ORM框架,从了解掌握到自己实现,慢慢积累了很多代码,直到201 ...

  9. Entity Framework Tutorial Basics(21):CRUD Operation in Connected Scenario

    CRUD Operation in Connected Scenario: CRUD operation in connected scenario is a fairly easy task bec ...

  10. 形式化验证工具(PAT)2PC协议学习

    今天我们来看看2PC协议,不知道大家对2PC协议是不是了解,我们先简单介绍一下. 两阶段提交协议(two phase commit protocol, 2PC)可以保证数据的强一致性,许多分布式关系型 ...