P5681 [CSP-J2019 江西] 面积 题解
终于可以写一道如此复杂的题的题解了!
题目就是说, Alice 有一个边长为 \(a\) 正方形,所以她的大小应该是:
\[\large a^2
\]
而 Bob 有一个 \(b*c\) 的长方形,所以他的大小就应该是:
\[\large b*c
\]
(小学的几何知识,应该都懂...)
乍一看,数据范围里面赫然写着:
对于 \(100\%\) 的数据, \(1\le a,b,c \le 10^9\) 。
像 \(10^9\) 那么大的数据,当然要用高精啦!
又一看, \(a^2\) ?,那就是赤裸裸的 高精+快速幂 !
话不多说,直接上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct sd{
int num[50];
int len;
}; //用结构体存储高精,计算更加方便。
sd a,b,c;
sd ans1,ans2;
sd mul(sd x,sd y) //高精乘
{
sd res;
memset(res.num,0,sizeof(res.num));
for(int i=1;i<=x.len;i++)
{
int t=0; //用于存放进位
for(int j=1;j<=y.len;j++) //对乘数的每一项进行处理
{
int p=i+j-1;
res.num[p]+=x.num[i]*y.num[j]+t; //原数 += (当前乘积 + 进位)
t=res.num[p]/10;
res.num[p]%=10;
}
res.num[i+y.len]+=t;
}
res.len=x.len+y.len;
while(res.num[res.len]==0&&res.len>1)
res.len--;
return res;
}
sd power(sd x,int y) //高精快速幂函数
{
if(y==1) return x;
if(y&1==1) return mul(power(mul(x,x),y>>1),x);
else return power(mul(x,x),y>>1);
}
bool check(sd x,sd y)
{
int maxlen=max(x.len,y.len);
for(int i=maxlen;i>=1;i--) //逐位比较大小
{
if(x.num[i]>y.num[i]) return true;
else if(x.num[i]<y.num[i]) return false;
}
return false;
}
int main()
{
char sta[50],stb[50],stc[50];
scanf("%s %s %s",sta,stb,stc); //以字符串方式输入
int lena=strlen(sta);
int lenb=strlen(stb);
int lenc=strlen(stc);
for(int i=0;i<lena;i++)
a.num[lena-i]=sta[i]-'0'; //把字符串转成int数组
a.len=lena;
for(int i=0;i<lenb;i++)
b.num[lenb-i]=stb[i]-'0'; //同上
b.len=lenb;
for(int i=0;i<lenc;i++)
c.num[lenc-i]=stc[i]-'0'; //同上
c.len=lenc;
ans1=power(a,2); //即a^2
ans2=mul(b,c); //即b*c
if(check(ans1,ans2)==true) printf("Alice\n");
else printf("Bob\n"); //比较两个面积的大小
return 0;
}
代码可以AC,仅用时 2ms 。
2021-11-07 16:43 撰写于洛谷,2025-08-25 17:01 迁移至博客园。
注:这篇题解实际上并未通过审核,它是我看到题解区早就关闭后自娱自乐的产物。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19057340

浙公网安备 33010602011771号