luoguP1080 国王游戏 (贪心+高精度)
题目链接:https://www.luogu.org/problemnew/show/P1080
参考:https://www.luogu.org/problemnew/solution/P1080
思路:这道题的考点是贪心和高精度。
贪心部分:
| …(设这一段乘积为X1) | …(设这一段乘积为Y2) |
|---|---|
| L1 | R1 |
| …(设这一段乘积为X2) | …(设这一段乘积为Y2) |
| L2 | R2 |
由上面这张表格可以知道这样的情况时:
第一个人所得的金币数为X1/R1;
第二个人所得的金币数为X1×L1×X2/R2;
所以最小值为 max(X1/R1, X1×L1×X2/R2);
然后交换两个人的位置
| …(这一段乘积为X1) | …(这一段乘积为Y2) |
|---|---|
| L2 | R2 |
| …(这一段乘积为X2) | …(这一段乘积为Y2) |
| L1 | R1 |
由上面这张表格可以知道交换后的情况时:
第一个人所得的金币数为X1×L2×X2/R1;
第二个人所得的金币数为X1/R2;
所以此时最小值为max(X1×L2×X2/R1, X1/R2);
综合上面两种情况:
如果变换之前的情况要优于变换之后的情况,那么
max(X1/R1, X1×L1×X2/R2) < max(X1×L2×X2/R1, X1/R2);
而X1/R1 < X1×L2×X2/R1 恒成立;
X1×L1×X2/R2 > X1/R2;
所以上述条件成立时
必须有X1×L1×X2/R2 < X1×L2×X2/R1 恒成立;所以化简可得 L1×R1 < L2×R2恒成立。
综上,很容易想到Li×Ri越大的应该排在越后面,所以对数据排个序就行。
另外就是高精度,数据最大可能达到10的4000次方,故需要使用高精度,这种高精度方法是参考的别人的,比较方便巧妙,不需要花费时间进行整数与字符串的转化。
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std; struct node{
int a,b;
bool operator < (const node& other) const{
return a*b<other.a*other.b;
}
}dat[]; int n,in=;
int hp[]; void mul(int k){
for(int i=;i<=in;i++)
hp[i]*=dat[k].a;
for(int i=;i<=in;i++){
hp[i+]+=hp[i]/;
hp[i]%=;
}
in++;
while(hp[in]>){
hp[in+]=hp[in]/;
hp[in]%=;
in++;
}
if(hp[in]==)
in--;
} void div(){
for(int i=in;i>=;i--){
hp[i-]+=((hp[i]%dat[n].b)*);
hp[i]/=dat[n].b;
}
while(hp[in]==)
in--;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&dat[i].a,&dat[i].b);
sort(dat+,dat+n+);
hp[]=dat[].a;
for(int i=;i<n;i++)
mul(i);
div();
if(in==)
printf(""); //最终数组长度为0,由于每个人都会得到赏金,故每个人最多分到1赏金
else
for(int i=in;i>=;i--)
printf("%d",hp[i]);
printf("\n");
return ;
}
luoguP1080 国王游戏 (贪心+高精度)的更多相关文章
- [noip2012]国王游戏<贪心+高精度>
题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...
- P1080 国王游戏 贪心 高精度
题目描述 恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nn 位大臣排成一排,国王站在队伍的 ...
- P1080 【NOIP 2012】 国王游戏[贪心+高精度]
题目来源:洛谷 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- 【NOIP2012提高组】国王游戏 贪心 + 高精度
题目分析 题目答案不具有单调性,所以不可以二分,转而思考贪心.因为无法确定位置,所以考虑如何才能让对于每一个$1 ~ i$使得$i$的答案最大,即$1 ~ i$最后一个最优.若设对于位置$i$,$a[ ...
- luoguP1080 国王游戏 题解(NOIP2012)(贪心+高精)
luoguP1080 国王游戏 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...
- Luogu P1080国王游戏(贪心)
国王游戏 题目链接:国王游戏 ps:题目数据说明了要写高精度. 这个题的答案是\(a.l * a.r < b.l * b.r\)按照这个进行排序 题解中大部分只是如何证明排序是: \(a.l * ...
- 洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度
题目:https://www.luogu.org/problemnew/show/P1080 排序方法的确定,只需任取两个人,通过比较与推导,可以得出ai*bi小的人排在前面: 高精度写的时候犯了些细 ...
- Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...
- 【NOIP 2012 国王游戏】 贪心+高精度
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
随机推荐
- php7 数据库操作的 方法
连接数据库的方法PHP7.0以上的: 方法一: <?php/* Connect to a MySQL server 连接数据库服务器 */$link = mysqli_connect('loca ...
- Java 经典练习题_Day06
面向对象与面向过程的比较 类与对象的关系 成员变量和局部变量 构造方法 this 构造代码块 局部代码块 匿名对象 一. 选择题 1.下列各项中关于面向对象及面向过程的说法错误的是:(BDE) A. ...
- SpringBoot 自定义线程池
本教程目录: 自定义线程池 配置spring默认的线程池 1. 自定义线程池 1.1 修改application.properties task.pool.corePoolSize=20 task.p ...
- 术语-软件-软件开发:SDK(软件开发工具包)
ylbtech-术语-软件-软件开发:SDK(软件开发工具包) 软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架 ...
- post 中文数据到elasticsearch restful接口报json_parse_exception 问题
我们的客户端程序直接调用es 的restful接口, 通过post json数据去查询, 但post数据有中文的时候,有些中文会报异常,有些中文不会 {"error":{" ...
- Ubuntu-14.04.1 desktop安装时遇到的小问题
su root认证失败:sudo passwd root,然后设置新密码. 重装linux导致g++显示已安装,但无法使用:将"系统设置"/"软件源"中所有更新 ...
- extract 用法说明
PHP extract() 函数从数组中把变量导入到当前的符号表中 定义和用法 PHP extract() 函数从数组中把变量导入到当前的符号表中. 对于数组中的每个元素,键名用于变量名,键值用于变量 ...
- 更新OpenSSH
1.安装必要组件: yum install -y gcc openssl-devel pam-devel rpm-build 2.下载OpenSSH最新版本: https://ftp.openbsd. ...
- Spring学习之AOP详解
aop使用方式 @Aspect注解 wildcards通配符: * 匹配任意数量的字符 + 匹配指定类及其子类 .. 一般用于匹配任意数的子包或参数 operators运算符 && 与 ...
- Django静态图片参数解析
使用Django静态设置时,遇到很多问题,经过艰苦的Baidu, stack overflow, Django原档阅读,终于把静态图片给搞出来了.特记录下来. 关键的概念:Django中,静态资源的存 ...