题目分析

题目答案不具有单调性,所以不可以二分,转而思考贪心。因为无法确定位置,所以考虑如何才能让对于每一个$1 ~ i$使得$i$的答案最大,即$1 ~ i$最后一个最优。若设对于位置$i$,$a[i]$表示左手,$b[i]$表示右手,$S$为其前面所有人的左手之积,那么他的答案就是$\frac{S}{b[i]}$,如果存在在$i$后边的$j$的答案更优, 即$\frac{S * a[i]}{b[j]} > \frac{S * a[j]}{b[i]} => a[i] * b[i] > a[j] * b[j]$,这样只要我们以a[i] * b[i]为关键字从小到大排序,就能保证每个前缀的最后一个都是最优的,只要$o(n)$扫一遍取最大值即可,记得使用高精度。

code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; const int N = ;
int n, a[N], b[N], c[N], ka, kb, kc; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} struct bign{
int len, s[];
bign():len(){memset(s, , sizeof s);}
bign(int x):len(){
memset(s, , sizeof s);
while(x){
s[++len] = x % ;
x /= ;
}
if(!len) len = ;
}
inline void clear(){
while(len > && s[len] == ) len--;
}
inline bign operator * (const bign &b) const{
bign ret;
ret.len = len + b.len + ;
for(int i = ; i <= len; i++)
for(int j = ; j <= b.len; j++)
ret.s[i + j - ] += s[i] * b.s[j];
for(int i = ; i <= ret.len; i++)
if(ret.s[i] >= ){
ret.s[i + ] += ret.s[i] / ;
ret.s[i] %= ;
}
ret.clear();
return ret;
}
inline bign operator - (const bign &b) const{
bign ret;
ret.len = len;
for(int i = ; i <= len; i++){
ret.s[i] = ret.s[i] + s[i];
if(i <= b.len) ret.s[i] = ret.s[i] - b.s[i];
if(ret.s[i] < ){
ret.s[i + ]--;
ret.s[i] += ;
}
}
ret.clear();
return ret;
}
bign operator / (int b) {
bign c;
int f = ;
for(int i = len; i >= ; i--){
f = f * + s[i];
while(!(f < b)){
f -= b;
c.s[i]++;
}
}
c.len = len;
c.clear();
return c;
}
inline bool operator > (const bign &b) const{
if(len != b.len) return len > b.len;
for(int i = len; i >= ; i--)
if(s[i] != b.s[i]) return s[i] > b.s[i];
return false;
}
inline bool operator == (const bign &b) const{
if(len != b.len) return false;
for(int i = len; i >= ; i--)
if(s[i] != b.s[i]) return false;
return true;
}
inline bool operator < (const bign &b) const{
if(len != b.len) return len < b.len;
for(int i = len; i >= ; i--)
if(s[i] != b.s[i]) return s[i] < b.s[i];
return false;
}
inline void print(){
for(int i = len; i >= ; i--)
wr(s[i]);
}
}fa, ans, big0, big10; struct node{
int a, b, c;
inline bool operator < (const node &u) const{
if(c != u.c) return c < u.c;
return b > u.b;
}
}data[N]; int main(){
n = read(), ka = read(), kb = read();
for(int i = ; i<= n; i++){
data[i].a = read(), data[i].b = read();
data[i].c = data[i].a * data[i].b;
}
sort(data + , data + n + );
fa = ka;
ans = ;
bign tmpa, t;
for(int i = ; i <= n; i++){
tmpa = data[i].a;
t = fa / data[i].b;
if(t > ans) ans = t;
fa = fa * tmpa;
}
ans.print();
return ;
}

【NOIP2012提高组】国王游戏 贪心 + 高精度的更多相关文章

  1. [NOIP2012提高组]国王游戏

    题目:洛谷P1080.Vijos P1779.codevs1198. 题目大意:国王和每个大臣左.右手各写了一个数.规定每个大臣得到的金币数为他前面所有人左手的数字的乘积除以他自己右手的数(向下取整) ...

  2. [noip2012]国王游戏<贪心+高精度>

    题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...

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

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

  4. P1080 【NOIP 2012】 国王游戏[贪心+高精度]

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

  5. NOIP2012提高组

    D1T1.Vigenère密码 模拟 #include<iostream> #include<cstdio> using namespace std; int main() { ...

  6. GZOJ 1361. 国王游戏【NOIP2012提高组DAY1】

    国王游戏[NOIP2012提高组DAY1] Time Limit:1000MS Memory Limit:128000K Description 国王游戏(game.cpp/c/pas) [问题描述] ...

  7. 刷题总结——疫情控制(NOIP2012提高组)

    题目: 题目背景 NOIP2012 提高组 DAY2 试题. 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都 ...

  8. 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

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

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

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

随机推荐

  1. Mongodb总结2-Java版本的HelloWorld-CRUD例子

    2013年,写的CRUD太简单了,今天在原来的基础上,稍微完善了下,用了更多语法,比如排序sort.in语句等. 参考了<Mongodb权威指南-第1版-高清>,等下上传到CSDN下载频道 ...

  2. 主定理(Master Theorem)与时间复杂度

    1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...

  3. 软件——机器学习与Python,if __name__ == '__main__':函数

    if __name__ == '__main__': 想必很多初次接触python都会见到这样一个语句,if __name__ == "__main__": 那么这个语句到底是做什 ...

  4. postman--下载及使用入门

    安装 本文只是基于 Chrome 浏览器的扩展插件来进行的安装,并非单独应用程序. 首先,你要台电脑,其次,安装有 Chrome 浏览器,那你接着往下看吧. 1. 官网安装(别看) 打开官网,http ...

  5. Vim 模式及常用命令整理

    VIM 命令     以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令.   vim的模式 基本上可以分为3种模式,分别是命令模式(command mode).插入模 ...

  6. thinkphp5最最最最简单的ajax实例

    thinkphp5最最最最简单的ajax实例 一.总结 一句话总结:页面端使用$.get()方法传递ajax请求,服务器端判断是不是ajax请求,是的话接受参数,进行逻辑处理之后向客户端返回值. 1. ...

  7. Altium Designer绘制mark点

    mark注:我之前是按照下面的文章去制作的,由于头一次制作没有经验,不是很成功 文章是正确的 只是我的一些配置出错了: 先看一下我们的板子: 关于错误mark点,主要是周边又一圈亮锡,, 原因大概是敷 ...

  8. 【p092】分数线划定

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 世博会志愿者的选拔工作正在A市如火如荼地进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔 ...

  9. 【t048】水流

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 全球气候变暖,小镇A面临水灾.于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放 ...

  10. 微服务API模拟框架frock介绍

    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/introducing-frock Urban Airship是一家帮助 ...