[luogu1080] 国王游戏
题面
这是一个比较经典(害人不浅)的题目啊, 很早就听说过这个题目的大名, 今日得见, 果然非凡题所可以比拟的啊, 行了, 瞎扯就先扯到这里, 题目大意应该是很好解释的, 我就不解释了, 要使得最大值最小啊, 我们第一个想到的肯定是二分啊, 但是这题不用二分(我也不知道为啥, 反正看到就知道不用二分). 要问比二分更好的策略是什么, 肯定是贪心了, 那么这道题就考虑贪心吧. 因为最大值最小, 我们可以从最后一个向前分析, 毕竟最后一个的值最大是概率最大的情况, 不妨设当前考虑的最后一个人位置为\(k\), 设前面\(k - 1\)个人左手的乘积为\(max(k - 1)\), 每个人左手的数为\(l[i]\), 右手的数为\(r[i]\)则有这样一个算式:
\]
观察到, 由于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] 国王游戏的更多相关文章
- luogu1080 国王游戏(贪心+高精度)
貌似这道题是碰巧蒙对了贪心的方式..就是把ai*bi越小的放在越前面 (不过也符合直觉) 然后统计答案需要用高精度,然后就调了一年 #include<cstdio> #include< ...
- NOIP2012 国王游戏
2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...
- 【NOIP 2012 国王游戏】 贪心+高精度
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- Codevs 1198 国王游戏 2012年NOIP全国联赛提高组
1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...
- 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 位大臣排成 ...
随机推荐
- Tomcat启动项目两次
网上一搜,给出的答案都一样,不外乎:1.删除 Host 标签配置的 appBase="webapps"2.删除 Context 配置 此处这样做:重新添加Tomcat,选择好自己的 ...
- python学习之老男孩python全栈第九期_数据库day002知识点总结 —— MySQL数据库day2(全部)
一. 复习1. MySQL: - 服务端 - 客户端2. 通信交流 - 授权 - SQL语句 - 数据库 创建数据库: create database db1 default charset utf8 ...
- 黑客之google入侵网站常用方式 2
一: 在搜索框上输入: “index of/ ” inurl:lib 再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍. 在搜索框上输入: “index of /” cnki 再按搜索你就可以 ...
- OnCreateContextMenuListener接口简介
OnCreateContextMenuListener接口是用来处理上下文菜单显示事件的监听接口.该方法是定义和注册上下文菜单的另一种方式.该接口中事件处理的回调方法签名如下所示. public vo ...
- jsonp promise封装
npm 安装jsonp import originJSONP from 'jsonp' export default function jsonp(url, data, option){ url += ...
- STL中 vector 和 list 一些特性
STL中的vector特点是: 其容量在需要时可以自动分配,本质上是数组形式的存储方式.即在索引可以在常数时间内完成.缺点是在插入或者删除一项时,需要线性时间.但是在尾部插入或者删除,是常数时间的. ...
- vuejs electron webpack集成使用
传统的vue SPA页面在浏览器环境中使用,但是有的时候我们还希望能够做成一个类似于桌面的app在PC上使用,希望不仅可以使用所有的浏览器SPA的功能,你也可能外加host os的功能,比如文件的本地 ...
- Oracle EBS 跳跳转标准销售订单程序转标准销售订单程序
-- 打开PO PROCEDURE Btn_Open_Po IS BEGIN Fnd_Function.Execute(Function_Name => 'PO_POXPOEPO', Open_ ...
- Entity Framework工具POCO Code First Generator的使用
在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...
- [翻译] REMenu
REMenu https://github.com/romaonthego/REMenu Dropdown menu inspired by Vine. 一款下拉菜单效果控件,灵感来自于Vine. R ...