题面

​ 这是一个比较经典(害人不浅)的题目啊, 很早就听说过这个题目的大名, 今日得见, 果然非凡题所可以比拟的啊, 行了, 瞎扯就先扯到这里, 题目大意应该是很好解释的, 我就不解释了, 要使得最大值最小啊, 我们第一个想到的肯定是二分啊, 但是这题不用二分(我也不知道为啥, 反正看到就知道不用二分). 要问比二分更好的策略是什么, 肯定是贪心了, 那么这道题就考虑贪心吧. 因为最大值最小, 我们可以从最后一个向前分析, 毕竟最后一个的值最大是概率最大的情况, 不妨设当前考虑的最后一个人位置为\(k\), 设前面\(k - 1\)个人左手的乘积为\(max(k - 1)\), 每个人左手的数为\(l[i]\), 右手的数为\(r[i]\)则有这样一个算式:

\[\frac{max(k - 1)}{r[k]} = \frac{max(k - 1) * l[k]}{r[k] * l[k]}
\]

​ 观察到, 由于k为最后一个数, 故\(max(k - 1)\)与\(l[k]\)的乘积是一个定值, 所以, 只要\(r[k] * l[k]\)的值最小就可以了, 然后假装选完了最后一个数, 选倒数第二个数, 此时倒数第二个数为除了最后一个数之外的最后一个数, 不停地往前选择, 最后会发现, 排队的方式就是按\(l[i] * r[i]\)的大小升序排序, 所以就可以做完了, 多好啊...

具体实现

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 20005
using namespace std; int n, L, R;
struct node
{
int l, r;
} per[N];
int sum[N], ans[N], num[N], cnt, tot, rnt; inline int read()
{
int x = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
} inline bool cmp(node a, node b) { return 1ll * a.l * a.r < 1ll * b.l * b.r; } inline int gett(int x)
{
if(!x) return 1;
int res = 0;
while(x)
{
res++;
x /= 10;
}
return res;
}guowangyouxi inline void times(int x)
{
bool flag = 0;
for(int i = cnt; i >= 0; i--)
{
sum[i] *= x;
int up = sum[i] / 10000;
sum[i] %= 10000;
if(up > 0)
{
if(i == cnt) { sum[cnt + 1] += up; flag = 1; }
else sum[i + 1] += up;
}
}
if(flag) cnt++;
} inline void divite(int x)
{
int rem = 0; rnt = cnt;
for(int i = cnt; i >= 0; i--)
{
num[i] = (rem * 10000 + sum[i]) / x;
rem = (rem * 10000 + sum[i]) % x;
}
while(!num[rnt]) rnt--;
} inline bool compare()
{
if(rnt > tot) return 1;
if(rnt < tot) return 0;
for(int i = rnt; i >= 0; i--)
{
if(num[i] > ans[i]) return 1;
if(num[i] == ans[i]) continue;
if(num[i] < ans[i]) return 0;
}
} inline void cp()
{
tot = rnt;
for(int i = 0; i <= tot; i++) ans[i] = num[i];
} int main()
{
n = read(); L = read(); R = read();
for(int i = 1; i <= n; i++) { per[i].l = read(); per[i].r = read(); }
sort(per + 1, per + n + 1, cmp);
sum[0] = L;
for(int i = 1; i <= n; i++)
{
divite(per[i].r);
times(per[i].l);
if(compare()) cp();
}
for(int i = tot; i >= 0; i--)
{
int number = 4 - gett(ans[i]);
if(i != tot) for(int j = 1; j <= number; j++) printf("0");
printf("%d", ans[i]);
}
puts("");
return 0;
}

​ 其实我是拒绝写高精度的, 因为初学OI的时候给我带了一些极其不好的感受, 但写完这个题后, 啊, 高精似乎也不是很难啊......

[luogu1080] 国王游戏的更多相关文章

  1. luogu1080 国王游戏(贪心+高精度)

    貌似这道题是碰巧蒙对了贪心的方式..就是把ai*bi越小的放在越前面 (不过也符合直觉) 然后统计答案需要用高精度,然后就调了一年 #include<cstdio> #include< ...

  2. NOIP2012 国王游戏

    2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...

  3. 【NOIP 2012 国王游戏】 贪心+高精度

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

  4. Codevs 1198 国王游戏 2012年NOIP全国联赛提高组

    1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...

  5. Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)

    Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...

  6. NOIP国王游戏

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  7. AC日记——国王游戏 洛谷 P1080

    国王游戏 思路: 贪心+高精: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 struct Dat ...

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

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

  9. 国王游戏 2012年NOIP全国联赛提高组(贪心+高精)

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

随机推荐

  1. Linux线程同步——条件变量

    互斥锁是用来给资源上锁的,而条件变量是用来等待而不是用来上锁的. 条件变量用来自动阻塞一个线程,直到某特殊情况发生为止. 通常条件变量和互斥锁同时使用. 和条件变量使用有关的几个重要函数: int p ...

  2. node.js和JavaScript的关系

    node.js是一个基于 Chrome V8 引擎的 JavaScript 运行时环境. 一.类比JavaScript和java JavaScript java V8 JVM node.js JRE ...

  3. webapi 后台跳转 后台输出html和script

    1.跳转 [HttpGet]public HttpResponseMessage LinkTo(){ HttpResponseMessage resp = new HttpResponseMessag ...

  4. Laravel 支付宝异步通知 419报错

    支付宝在支付是有服务器通知和网页通知,一个在前端展示,一个在后台操作, laravel框架自带csrf_token验证. 所以我们需要把支付的路由跳过验证 可以在中间键的csrf配置中更改

  5. 新电脑装不了win7?来试试我的方法!

    好久没写日记了,今天稍有时间来写个有关于硬件的技术贴.    前段时间换了个惠普暗影精灵二代,它的cpu代数如图所示:      用了几天系统自带win10,不同浏览器字体模糊的问题是个问题,故而想装 ...

  6. IOS下 input 被软键盘方案遮盖问题解决

    前言: 并没有完美解决 ! 场景: 最近在做企业微信H5的一个项目,里面有个动态列表页,开始输入框是隐藏的,点击评论才会出现并让 input 聚焦.经过测试在安卓上面应该没什么问题,但是iOS上面会出 ...

  7. BS和CS的区别

    C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Informix或 SQL Server.客户端 ...

  8. elixir 模式匹配

    elixir 模式匹配刚接触还是有点不习惯,在Elixir里,=操作符被称为匹配操作符 iex(29)> x = 11iex(30)> x1iex(31)> 1 = x1iex(32 ...

  9. Ubuntu中网络配置interfaces与界面网络配置NetworkManager

    [Server版本] 在Ubuntu Server版本中,因为只存有命令行模式,所以要想进行网络参数设置,只能通过修改 /etc/network/interfaces .具体设置方法如下: (1) U ...

  10. Keras vs. PyTorch

    We strongly recommend that you pick either Keras or PyTorch. These are powerful tools that are enjoy ...