题面

​ 这是一个比较经典(害人不浅)的题目啊, 很早就听说过这个题目的大名, 今日得见, 果然非凡题所可以比拟的啊, 行了, 瞎扯就先扯到这里, 题目大意应该是很好解释的, 我就不解释了, 要使得最大值最小啊, 我们第一个想到的肯定是二分啊, 但是这题不用二分(我也不知道为啥, 反正看到就知道不用二分). 要问比二分更好的策略是什么, 肯定是贪心了, 那么这道题就考虑贪心吧. 因为最大值最小, 我们可以从最后一个向前分析, 毕竟最后一个的值最大是概率最大的情况, 不妨设当前考虑的最后一个人位置为\(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. java存储图片

    import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util. ...

  2. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  3. python之多进程multiprocessing模块

    process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...

  4. VS2013平台安装Qt插件过程

    1.下载所需安装包: Qt5.3.Qt插件下载地址:http://qt-project.org/downloads. qt-vs-addin-1.1.11-opensource.exe 下载地址:ht ...

  5. JS实现继承的几种方式以及优缺点(转载)

    前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...

  6. ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除

    我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢 首先实 ...

  7. LINQ语法类似于SQL的语法

    LINQ语法类似于SQL的语法如下, Models.BookStoreEntities 是从添加新建项中的数据--->ADO.NET实体数据模型--->从数据库生成--->使用5.0 ...

  8. 第二十三天- 模块 re

    # 1. 正则表达式 # 元字符# . 除了换行符外任意字符# \w 数字 字母 下划线# \s 空白符# \b 单词的末尾# \d 数字# \W 除了数字 字母 下划线# \D 除了数字# \S 除 ...

  9. (项目积累的)SQL数据库点滴

    最近的的系统用的数据库是mssql,软件mssql 2008 r2 1.存储过程:后勤的综合管理系统(后端内网访问)三层架构配套用的是存储过程,里面列表展示的都是用存储过程,如下: 1)数据库脚本 U ...

  10. 如何选择分布式事务形态(TCC,SAGA,2PC,基于消息最终一致性等等)

    各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务 基于TCC实现的分布式事务 基于SAGA实现的分布式事务 基于2PC实现的分布式事务 这些形 ...