洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度
题目:https://www.luogu.org/problemnew/show/P1080
排序方法的确定,只需任取两个人,通过比较与推导,可以得出ai*bi小的人排在前面;
高精度写的时候犯了些细节错误,详见注释。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200005
using namespace std;
typedef long long ll;//用long long!
ll n,ka,kb,ans[MAXN],tmp[MAXN],tmp2[MAXN],c[MAXN];
struct N{
ll a,b;
}p[];
bool cmp(N x,N y)
{
return x.a*x.b<y.a*y.b;
}
void chu(ll a[],ll b)
{
ll x=;
c[]=a[];
for(ll i=a[];i>;i--)//倒序存储,正序除
{
c[i]=(x*+a[i])/b;
x=(x*+a[i])%b;
}
while(c[c[]]==&&c[]>)c[]--;
}
void ch(ll a[],ll b)
{
ll x=;
for(ll i=;i<=a[];i++)//倒序乘
{
a[i]*=b;a[i]+=x;
x=a[i]/;
a[i]%=;
}
while(x)a[]++,a[a[]]=x%,x/=;
}
int com(ll a[],ll b[])
{
if(a[]>b[])return ;
if(a[]<b[])return -;
for(ll i=a[];i;i--)//倒序!
if(a[i]>b[i])return ;
return ;
}
void print(ll a[])
{
// if(a[a[0]]==0)//?
// {
// printf("1");
// return;
// }
printf("%lld",a[a[]]);
for(ll i=a[]-;i>;i--)
{
printf("%lld",a[i]/);
a[i]%=;
printf("%lld",a[i]/);
a[i]%=;
printf("%lld",a[i]/);
a[i]%=;
printf("%lld",a[i]);
}
}
int main()
{
scanf("%lld%lld%lld",&n,&ka,&kb);
for(ll i=;i<=n;i++)
scanf("%d%d",&p[i].a,&p[i].b);
sort(p+,p+n+,cmp);
tmp[]=;tmp[]=ka;//压位
for(ll i=;i<=n;i++)
{
memcpy(tmp2,tmp,sizeof tmp);
memset(c,,sizeof c);
chu(tmp2,p[i].b);
if(com(c,ans)>)memcpy(ans,c,sizeof c);//必须>0,否则-1也会被算!
ch(tmp,p[i].a);
}
print(ans);
return ;
}
这个运行起来有点慢,有些地方写得不够好,下面有一篇运行很快的代码,可以比较看看提速的方法。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=;
typedef long long ll;
ll n,gb,ljc[],max,tmp[],ans[];
char tp[];
struct Node{
ll a,b,w;
}r[];
bool cmp(Node x,Node y)
{
return x.w<y.w;
}
void chu(ll b)
{
ll x=;
tmp[]=ljc[];
for(ll i=ljc[];i;i--)
{
ll s=ljc[i]+x*INF;
tmp[i]=s/b;
x=s%b;
}
while(!tmp[tmp[]]&&tmp[]>)tmp[]--;
}
bool comp(ll ans[],ll b[])
{
if(ans[]>b[])return ;
if(ans[]<b[])return ;
for(ll i=ans[];i;i--)
{
if(ans[i]>b[i])return ;
if(ans[i]<b[i])return ;
}
return ;
}
void mul(ll a)
{
ll x=;
for(ll i=;i<=ljc[];i++)
{
ll s=ljc[i]*a+x;
x=s/INF;
ljc[i]=s%INF;
}
if(x)ljc[]++,ljc[ljc[]]=x;//至多进一位
}
int main()
{
scanf("%lld%lld%lld",&n,&ljc[],&gb);
ljc[]=;
for(ll i=;i<=n;i++)
{
scanf("%lld%lld",&r[i].a,&r[i].b);
r[i].w=r[i].a*r[i].b;
}
sort(r+,r+n+,cmp);
for(ll i=;i<=n;i++)
{
memset(tmp,,sizeof tmp);
chu(r[i].b);
if(comp(ans,tmp))memcpy(ans,tmp,sizeof tmp);
mul(r[i].a);
}
printf("%lld",ans[ans[]]);
for(ll i=ans[]-;i;i--)
{
printf("%lld",ans[i]/);
printf("%lld",ans[i]/%);
printf("%lld",ans[i]/%);
printf("%lld",ans[i]%);
}
return ;
}
洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度的更多相关文章
- 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)
次元传送门::洛谷P1080 思路 我们模拟一下只有两个大臣的时候发现 当a1∗b1<a2∗b2是ans1<ans2 所以我们对所有大臣关于左右手之积进行排序 得到最多钱的大臣就是 ...
- 【洛谷P1080】国王游戏
我们按照左右手数的乘积升序排序,就能使最多金币数最小了 为什么呢? 我们知道: 1)如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人 2)假设相邻的两个人i, i + 1.设A[i] B ...
- 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 ...
- [noip2012]国王游戏<贪心+高精度>
题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...
- [NOIp2012] 国王游戏(排序 + 贪心 + 高精度)
题意 给你两个长为 \(n+1\) 的数组 \(a,b\) ,你需要定义一个顺序 \(p\) (\(p_0\) 永远为 \(0\)) 能够最小化 \[ \max_{i=1}^{n} \frac{\pr ...
- 洛谷$P$2123 皇后游戏 贪心
正解:贪心 解题报告: 传送门! 心血来潮打算把$luogu$提高历练地及其之前的所有专题都打通关,,,$so$可能会写一些比较水的题目的题解$QAQ$ 这种题,显然就套路地考虑交换相邻两个人的次序的 ...
- Luogu P1080 [NOIP2012]国王游戏
题目 按\(a_i*b_i\)升序排序即可. 证明考虑交换法. 对于排序后相邻的两个人\(i,j(a_ib_i\le a_jb_j)\),设前面的总的积为\(s\),则当前答案为\(\max(\fra ...
- NOIP2012 Day1 T2国王游戏 洛谷P1080
第一篇博客啊…… 由于我太弱了,还要去补不全的知识点准备参加人生第一次NOIp,所以第一篇博客就简短一点好了(偷懒就直说吧……) 洛谷P1080传送门 题意概括: 有N对数ai和bi,以及两个数a0和 ...
- 洛谷1377 M国王 (SCOI2005互不侵犯King)
洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...
随机推荐
- HTML元素定位
一切皆为框 div.h1 或 p 元素常常被称为块级元素(block element).这意味着这些元素显示为一块内容,即"块框".与之相反,span 和 strong 等元素称为 ...
- Redis专题(2):Redis数据结构底层探秘
前言 上篇文章Redis闲谈(1):构建知识图谱介绍了redis的基本概念.优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识.互联网的很多应用场景都有着Redis的身影,它能做的事情远远 ...
- 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\ry.php on line 11 意 ...
- HTTP状态码介绍详细
HTTP协议中几个状态码的含义:1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分, ...
- IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(二)
IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(二) IdentityServer4 用户中心生成数据库 上文已经创建了所有的数据库上下文迁移代码 ...
- EasyPlayerPro Windows流媒体播放器(RTSP/RTMP/HTTP/HLS/File/TCP/RTP/UDP都能播)发布啦
EasyPlayerPro简介 EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP.RTMP.HTTP.HLS.UDP.RTP.File等多种流媒体协议播放.支持本地文件播放,支持本地 ...
- BZOJ4944: [Noi2017]泳池
BZOJ4944: [Noi2017]泳池 题目背景 久莲是个爱玩的女孩子. 暑假终于到了,久莲决定请她的朋友们来游泳,她打算先在她家的私人海滩外圈一块长方形的海域作为游泳场. 然而大海里有着各种各样 ...
- linux安装mongodb,设为全局和后台启动
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.5.tgz # 下载 tar -zxvf mongodb-linux ...
- 20170326 ABAP调用外部webservice实例
调用外部webservice 使用Tcode: SICF SPROXSET 设置创建proxy 的权限 SE80 SOAMANAGER 一.目的:调用外部SRM系统的 webservice: ...
- 超限学习机 (Extreme Learning Machine, ELM) 学习笔记 (一)
1. ELM 是什么 ELM的个人理解: 单隐层的前馈人工神经网络,特别之处在于训练权值的算法: 在单隐层的前馈神经网络中,输入层到隐藏层的权值根据某种分布随机赋予,当我们有了输入层到隐藏层的权值之后 ...