国王游戏(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+ ...
随机推荐
- js中判断数据类型的方法 typeof
<input type="text" onblur="demo(this)"/><br/> <input type="n ...
- d3学习笔记
(1)使用enter()函数. 当要创建新的绑定数据的元素,必须使用enter().这个方法会分析当前选择的DOM元素和传给它的数据,如果数据值比对应的DOM元素多,就创建一个新的占位元素.然后把这个 ...
- 171 Excel Sheet Column Number Excel表列序号 26进制转10进制
给定一个Excel表格中的列名称,返回其相应的列序号.示例: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -&g ...
- web api 解决Ajax请求跨域问题
前端ajax请求接口时,经常出现跨域问题,当然了解决方法有很多种,比如: http://www.jb51.net/article/68424.htm 我本人恰好前后端都会一点,所以直接在接口端处理. ...
- Java 线程是什么-渐入佳境
线程:(一)什么是线程 管哥说:程序中有多个执行流就叫多线程.多线程是多任务的一种特别的形式.好处:单个程序可以创建多个并发执行的程序来完成各自的任务.多线程能满足程序员编写高效率的程序来达到充分利用 ...
- AJPFX:如何保证对象唯一性呢?
思想: 1,不让其他程序创建该类对象. 2,在本类中创建一个本类对象. 3,对外提供方法,让其他程序获取这个对象. 步骤: 1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序 ...
- 谷歌的 I/O 2019,究竟推出了什么新特性?
前言 昨天,也即赶在微软 Build 2019 的第二天,一年一度的2019年 Google I/O大会在美国如期举行,Google I/O 2019全纪录:AI惊艳,Android Q真香,包括两款 ...
- 将Jenkins的测试结果整合到Testlink
如果试用Jenkins进行构建,构建中的测试结果可以直接作为Testlink的自动直接结果. 1. Testlink 中新增custom field. 2. 用例中custom field中加 ...
- 【分享】iTOP-iMX6UL开发板驱动看门狗 watchdog 以及 Linux-c 测试例程
iTOP-iMX6UL开发板看门狗测试例程,iTOP-iMX6UL 开发板的看门狗驱动默认已经配置,可以直接使用测试例程. 版本 V1.1:1.格式修改:2.例程修改完善,其中增加喂狗代码.1 看门狗 ...
- leetcode_919. Complete Binary Tree Inserter
https://leetcode.com/problems/complete-binary-tree-inserter/ 设计一个CBTInserter,使用给定完全二叉树初始化.三个功能; CBTI ...