洛谷—— P1080 国王游戏
https://www.luogu.org/problem/show?pid=1080
题目描述
恰逢 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。
NOIP 2012 提高组 第一天 第二题
贪心
设 i, j=i+1 tot为i之前的所有人的左手积 Li,Ri Lj Rj
则 j 的奖赏为 tot*Li/Rj 若交换 i与j i 的奖赏为 tot*Lj/Ri
尽量使前面的大臣奖赏少的话 应是 tot*Li/Rj < tot*Lj/Ri 即 Li*Ri<Lj*Rj
#include <algorithm>
#include <cstdio> using namespace std; const int N();
int n,ans,tot=; struct Node
{
int l,r;
}p[N];
bool cmp(Node a,Node b)
{
return a.l*a.r<b.l*b.r;
} int main()
{
scanf("%d",&n);
scanf("%d%d",&p[].l,&p[].r);
for(int i=;i<=n;i++) scanf("%d%d",&p[i].l,&p[i].r);
sort(p+,p+n+,cmp);
for(int i=;i<n;i++)
{
tot=(long long)tot*p[i].l;
ans=max(ans,tot/p[i+].r);
}
printf("%lld",ans);
return ;
}
60
高精AC、、、数组开大、、e xin
#include <algorithm>
#include <cstring>
#include <cstdio> using namespace std; const int N();
int n; struct Node
{
int l,r;
}p[N];
bool cmp(Node a,Node b)
{
return a.l*a.r<b.l*b.r;
} struct Gj
{
int num[];
void init()
{
memset(num,,sizeof(num));
num[]=; num[]=;
}
void mul(int x)
{
for(int i=,ove=;i<=num[];i++)
{
num[i]=num[i]*x+ove;
if(num[i]>)
{
ove=num[i]/;
num[i]%=;
num[]=max(num[],i+);
}
else ove=;
}
for(;!num[num[]];) num[]--;
}
void del(int x)
{
for(int t=,i=num[];i;i--)
{
int tt=num[i];
num[i]=(t*+tt)/x;
t=(t*+tt)%x;
}
for(;!num[num[]];) num[]--;
}
void print()
{
for(int i=num[];i;i--) printf("%d",num[i]);
} };
Gj temp,ans;
Gj MAX(Gj a,Gj b)
{
if(a.num[]>b.num[]) return a;
else if(a.num[]<b.num[]) return b;
for(int i=a.num[];i;i--)
{
if(a.num[i]>b.num[i]) return a;
else if(a.num[i]<b.num[i]) return b;
}
return a;
} int main()
{
scanf("%d",&n);
scanf("%d%d",&p[].l,&p[].r);
for(int i=;i<=n;i++) scanf("%d%d",&p[i].l,&p[i].r);
sort(p+,p+n+,cmp);
temp.init(); ans.num[]=;
for(int i=;i<n;i++)
{
temp.mul(p[i].l);
Gj tmp=temp; tmp.del(p[i+].r);
ans=MAX(ans,tmp);
}
ans.print();
return ;
}
洛谷—— P1080 国王游戏的更多相关文章
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
		
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
 - 【题解】洛谷 P1080 国王游戏
		
目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...
 - 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序
		
洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...
 - [NOIP2012] 提高组 洛谷P1080 国王游戏
		
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
 - 洛谷 P1080 国王游戏
		
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
 - 洛谷P1080 国王游戏【大数】【贪心】
		
题目:https://www.luogu.org/problemnew/show/P1080 题意: 一个国王和n个大臣,每个人左右手上都有一个数值. 现在将国王排在队首,将大臣进行排序.每个大臣的值 ...
 - 洛谷P1080 国王游戏
		
两个难点. 怎么想到的贪心? 首先确定算法: 显然不是数据结构题.转成图论也不太可能. 考虑DP:f[i][j]表示前i个人取j状态的最小最大值......2^1000,直接放弃. 因为出现了“最大值 ...
 - 洛谷 P1080 国王游戏 题解
		
原题 传送门 思路 分析 我们先假设队伍如下: People left hand right hand Before \(S_a\) A \(a_1\) \(b_1\) B \(a_2\) \(b_2 ...
 - 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)
		
次元传送门::洛谷P1080 思路 我们模拟一下只有两个大臣的时候发现 当a1∗b1<a2∗b2是ans1<ans2 所以我们对所有大臣关于左右手之积进行排序 得到最多钱的大臣就是 ...
 
随机推荐
- UVALive - 6266 Admiral  费用流
			
UVALive - 6266 Admiral 题意:找两条完全不相交不重复的路使得权值和最小. 思路:比赛的时候时间都卡在D题了,没有仔细的想这题,其实还是很简单的,将每个点拆开,连一条容量为1,费用 ...
 - JavaScript Debug调试技巧
			
收藏于:https://blog.fundebug.com/2017/12/04/javascript-debugging-for-beginners/
 - Dom4j  查找节点或属性
			
Dom4j 查找节点或属性 例如 1 查找下面xml中的student节点的age属性, xpathstr="/students/student/@age"; 2 查找下面xml ...
 - Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
			
Linux下通过.desktop 文件创建桌面程序图标及文件编写方式 1.Desktop Entry文件概述:在 Windows 平台上,用户可以通过点击位于桌面或菜单上的快捷方式轻松打开目标应用程序 ...
 - How Javascript works (Javascript工作原理) (十二) 网络层探秘及如何提高其性能和安全性
			
个人总结:阅读完这篇文章需要20分钟,这篇文章主要讲解了现代浏览器在网络层传输所用到的一些技术, 应当对 window.performance.timing 这个API所有了解. 这是 JavaScr ...
 - Linux学习总结(8)——VMware v12.1.1 专业版以及永久密钥
			
VMware v12.1.1 专业版以及永久密钥 热门虚拟机软件VMware Workstation 现已更新至v12.1.1 专业版!12.0属于大型更新,专门为Win10的安装和使用做了优化,支持 ...
 - CCF模拟题 字符串匹配
			
字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写 ...
 - [c++]基类对象作为函数參数(赋值兼容规则)
			
编程处理教师的基本情况. 要求: 1.定义一个"person"类.用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承&q ...
 - 通过js动态创建button
			
通过js动态创建button 一.实例描述 通过JS的DOM对象,实现元素的动态创建. 二.效果 三.代码 <!DOCTYPE html> <html lang="zh-c ...
 - 关于 js 的框架方向
			
关于 js 的框架方向 http://www.breck-mckye.com/blog/2014/12/the-state-of-javascript-in-2015/?utm_source=ourj ...