【第一届文翁杯现场竞技赛T4】文翁的难题

本文介绍了一种通过取对数相加的方式比较两个数列乘积大小的算法,适用于大数运算,避免了直接计算乘积带来的溢出问题。

【题目】

传送门

题目描述:

文翁班上有一个菜鸡 z x y o i zxyoi zxyoi,天天被机房一众大佬吊打。

今天 z x y o i zxyoi zxyoi 终于 ACWOJ1000A+B)非常激动,但是文翁看他那傻样实在看不下去了,于是出了一道题来考考他。

文翁给了 z x y o i zxyoi zxyoi 两个数列 A,B,他想问 z x y o i zxyoi zxyoi 哪个数列的总乘积更大。

z x y o i zxyoi zxyoi 绞尽脑汁,还是不知道怎么做。。。

z x y o i zxyoi zxyoi:高精度? 文翁:自重。

文翁问得很奇怪,他每次给你 2 2 2 个数字 a i , b i a_i,b_i ai,bi,问现在两个序列的关系

输入格式:

第一行 n n n 表示数列长度( n ≤ 1 0 5 n\le10^5 n105

接下来 n n n 行每行 2 2 2 个整数 a i , b i a_i,b_i ai,bi 1 ≤ a i , b i ≤ 1 0 9 1\le a_i,b_i\le10^9 1ai,bi109

输出格式:

n n n 行,对于每组数,回答已经得到的序列现在的乘积关系

如果 A 序列大输出 ‘A’B 序列大输出 ‘B’,相等则输出 ‘equal’

样例数据:

输入
5
1 1
2 1
3 1
4 48
5 1

输出
equal
A
A
B
A


【分析】

其实这道题也是道水题啦。

主要思想就是把数取对数后再相加判大小。(根据 log ⁡ 2 ( x × y ) = log ⁡ 2 x + log ⁡ 2 y \log_2(x\times y)=\log_2 x+\log_2y log2(x×y)=log2x+log2y

然后注意一下精度就行了。


【代码】

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define eps 1e-6
using namespace std;
double sum1=0,sum2=0;
int main()
{
	int n,i,x,y;
	scanf("%d",&n);
	double sum1=0,sum2=0;
	for(i=1;i<=n;++i)
	{
		scanf("%d%d",&x,&y);
		sum1+=log2(x),sum2+=log2(y);
		if(fabs(sum1-sum2)<eps)  puts("equal");
		else  puts((sum1>sum2)?"A":"B");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值