国王游戏(codevs 1198)
题目描述
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
输入输出格式
输入格式:
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式:
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入输出样例
输入样例#1:
3
1 1
2 3
7 4
4 6
输出样例#1:
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%的数据,保证答案不超过 109;
对于 100%的数据,有 1 ≤ n ≤1,000,0 < a、b < 10000。
分析:
求最大金币数的最小值,很容易让人想到二分,但是仔细一想不满足单调性,正解要用贪心做。贪心方案:按左边乘右边从小到大排序。
原因:我们设需要交换的两个大臣左右边为a1,b1,a2,b2;如果不交换的话,后面那个大臣为tot(前面累加的)*a1/b2,否则为tot*b1/a2,要想让不交换时小,a1/b2就要小于b1/a2,化简后为a1*b1<a2*b2,并且显然后面的大于前面的,所以贪心方案成立。
然后就是恶心的高精度了!!! 代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define M 5010
using namespace std;
int kingz,kingy;int n,a1[M],b1[M];
struct node1
{
int zuo,you;
};node1 e[M];
struct node2
{
int p[M],l;
node2()
{
memset(p,,sizeof(p));
l=;
}
};node2 ans,p;
int read()
{
char c=getchar();int num=,flag=;
while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
return num*flag;
}
bool cmp(const node1&x,const node1&y)
{
return x.zuo*x.you<y.zuo*y.you;
}
node2 cheng(node2 a,int b)
{
memset(a1,,sizeof(a1));
memset(b1,,sizeof(b1));
node2 c;
int len=a.l;
for(int i=;i<=a.l;i++)a1[i]=a.p[len-i+];
for(int i=;i<=len;i++)
{
b1[i]+=a1[i]*b;
b1[i+]+=b1[i]/;
b1[i]%=;
}
while(b1[len+]>=)
{
b1[len+]=b1[len+]/;
b1[len+]%=;
len++;
}
if(b1[len+])len++;c.l=len;
for(int i=;i<=len;i++)c.p[i]=b1[len-i+];
return c;
}
node2 chu(node2 a,int b)
{
memset(a1,,sizeof(a1));
node2 c;
int x=;
for(int i=;i<=a.l;i++)
{
a1[i]=(x*+a.p[i])/b;
x=x*+a.p[i]-a1[i]*b;
}
int len=;
while(!a1[len]&&len)len++;
for(int i=len;i<=a.l;i++)
c.p[++c.l]=a1[i];
return c;
}
node2 big(node2 a,node2 b)
{
node2 c;bool flag=false;
if(a.l<b.l)flag=true;
if(a.l==b.l)
{
for(int i=;i<=a.l;i++)
if(a.p[i]<b.p[i]){flag=true;break;}
}
if(flag)
{
c.l=b.l;
for(int i=;i<=c.l;i++)c.p[i]=b.p[i];
}
else
{
c.l=a.l;
for(int i=;i<=c.l;i++)c.p[i]=a.p[i];
}
return c;
}
void init(int x)
{
memset(a1,,sizeof(a1));
int len=;
while(x)
{
a1[++len]=x%;
x/=;
}
p.l=len;
for(int i=;i<=len;i++)
p.p[len-i+]=a1[i];
}
int main()
{
scanf("%d",&n);
kingz=read();kingy=read();
for(int i=;i<=n;i++)
e[i].zuo=read(),e[i].you=read();
sort(e+,e+n+,cmp);
init(kingz);
for(int i=;i<=n;i++)
{
node2 ch=chu(p,e[i].you);
ans=big(ans,ch);
p=cheng(p,e[i].zuo);
}
for(int i=;i<=ans.l;i++)
printf("%d",ans.p[i]);
return ;
}
国王游戏(codevs 1198)的更多相关文章
- Codevs 1198 国王游戏 2012年NOIP全国联赛提高组
1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...
- [noip2012]国王游戏<贪心+高精度>
题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...
- NOIP2012 国王游戏
2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...
- 【NOIP 2012 国王游戏】 贪心+高精度
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...
- NOIP国王游戏
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...
- AC日记——国王游戏 洛谷 P1080
国王游戏 思路: 贪心+高精: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 struct Dat ...
- Luogu P1080国王游戏(贪心)
国王游戏 题目链接:国王游戏 ps:题目数据说明了要写高精度. 这个题的答案是\(a.l * a.r < b.l * b.r\)按照这个进行排序 题解中大部分只是如何证明排序是: \(a.l * ...
- 国王游戏 2012年NOIP全国联赛提高组(贪心+高精)
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成 ...
- 【题解】洛谷 P1080 国王游戏
目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...
随机推荐
- centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
一.安装环境 操作系统 Windows7 Enterprise 64位 需要用到的软件 JDK:jdk-8u60-linux-x64.rpm Glassfish: Glassfish4.1.1.zip ...
- 解决max解析记录与cname不能共存的问题
问题描述: 在腾讯上做了域名邮箱解析,需要将max记录绑定到主机记录为@(即空)的记录下. 而在做域名解析的时候,为了方便,需要将不带3w的域名也要解析到主机记录为@(即空)的记录下. 因此,解析报错 ...
- 免费公共DNS服务器IP地址大全(2017年6月24日)
收集全球各个常用公共DNS服务器 IP地址,欢迎各位朋友评论补充! 国内常用公共DNS 114 DNS: (114.114.114.114: 114.114.115.115) 114DNS安全版 ...
- Python3.0 调用HTMLTestRunner生成的报告中不能显示用例中print函数的输出
官方原生的HTMLTestRunner.py支持python2.0版本,python3.0版本的使用需要做一些修改: Python3调用HTMLTestRunner执行用例生成测试报告中,不能正常显示 ...
- Spring工作原理及其作用
1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个Hand ...
- 小写bool和大写BOOL的区别
转:https://blog.csdn.net/ji0525084/article/details/8594469 bool是标准C++中的布尔量,占一个字节大小内存,只有false或者true.具有 ...
- Spring全局异常捕获
package org.xxx.ac.zpk.exception; import java.io.IOException; import javax.servlet.http.HttpServletR ...
- mac 下安装python pil
mac:sudo brew install freetype sudo pip install pillow ubuntu: sudo apt-get install libfreetype6-dev ...
- ubuntu apt-update NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
Fetched 28.1 MB in 11s (2344 kB/s) W: GPG error: http://archive.canonical.com xenial Release: The fo ...
- 只允许特定IP访问本网站的前端写法
在开发的过程中,有时会遇到只允许特定的几个IP访问.今天来记录一下前端的写法. 首先,引入 <script src="http://pv.sohu.com/cityjson?ie=ut ...