题面

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

    Problem 1752 A^B mod C Accept: 579    Submit: 2598Time Limit: 1000 mSec    Memory Limit : 32768 KB P ...

  2. spring boot入门笔记 (二) - application.properties配置文件

    项目最重要的一个东西,用来定义整个项目的一些东西(端口.访问项目的名称.数据源.日志.集成mybatis等框架.静态资源目录.thymeleaf.热部署等),很重要很重要的. #整个项目的端口号,默认 ...

  3. K:红黑树

      红黑树由AVL树改进而来,红黑树与AVL都是平衡结构的树.对于AVL树,其每次插入操作都需要从根节点处开始判断该树是否失去平衡,从而做出相应的调整.且其调整过程较为麻烦,每次都需要判断其左右两棵子 ...

  4. Docx4j将html转成word时,br标签为软回车的问题修改

    docx4j版本:3.0.1 修改jar包:docx4j-ImportXHTML maven配置为: 具体代码位置:\org\docx4j\convert\in\xhtml\XHTMLImporter ...

  5. 思维导图(JavaScript基础)——温习一下下

  6. 【Android】Retrofit网络请求Service,@Path、@Query、@QueryMap...

    对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了. 下面分为GET.POST.DELETE还有PUT的请求,说明@Path.@Query.@QueryMap.@Bo ...

  7. org.springframework.data.redis.cache.RedisCacheManager

    org.springframework.data.redis.cache.RedisCacheManager

  8. JQuery 简单表格验证

    <form action="{% url 'register' %}" method="post"> 用户名:<input id=" ...

  9. 【Java】生成UUID

    import java.util.UUID; public class MainProcess { public static void main(String[] args) { UUID uuid ...

  10. hibernate的延迟加载和抓取策略

    一,延迟加载 1.实体类延迟加载 通过代理机制完成,由javassist类库实现运行时代理,修改实体类的字节码实现了运行时代理     <class lazy="true|false& ...