爱丽丝·玛格特罗依德

编程入门 行业动态 更新时间:2024-10-10 08:25:16

<a href=https://www.elefans.com/category/jswz/34/1761254.html style=爱丽丝·玛格特罗依德"/>

爱丽丝·玛格特罗依德

题目描述
在幻想乡中,爱丽丝·玛格特罗依德是一名居住在魔法森林的魔法使,擅长召唤人偶。一天她的姬友帕秋莉找到了她,要他防御雾雨魔理沙对巴瓦卢魔法图书馆的“破坏”。
她有n点魔法值,每召唤出一个『上海人形』就要消耗若干点(x),最后,它们造成的威力就是每个人形所消耗的魔法值的总积。
她为了知道能有多少威力,找到了全幻想乡唯一会编程的你,你不会让她失望吧?

Rewrote From Izayoi Sakuya

输入
n

输出
最大威力

样例输入
10
样例输出
36

本题易错点:
1.时间超限:要运用多次幂快速求解
2.内存溢出:已存在的类型内存太小,要运用高精度

本题题解:
与已知周长求最大面积类似,可层层拆分,例如
10—>5*5
5—>2*3
到2*3之后便不能拆分

但2*2*2<3*3,所以本题就要找更多的3
3*1<2*2,所以当a/3=1,a/3要减1,让原来的数*4

参考代码

#include<stdio.h>
#include<string.h>
#include<math.h>void cons(int x,int a[],int b[]){//判断余几,然后确定将3^y-1乘完之后要成几if(x==0){a[0]=3;b[0]=3;}if(x==1){a[0]=4;b[0]=3;}if(x==2){a[0]=6;b[0]=3;}
}
void mul(int *a,int *b,int k1,int k2){//高精度*高精度int i,j,c[60000],x;memset(c,0,sizeof(c));for(j=0;j<k1;j++){x=0;for(i=0;i<k2;i++){c[j+i]=c[j+i]+x+a[j]*b[i];x=c[j+i]/10;c[j+i]=c[j+i]%10;}c[j+i]=x;}memcpy(a,c,60000*sizeof(int));
}int main(){int n,x,y,i,j,f,k,t,k1,k2;int b[60000],d[60000],a[1];memset(d,0,sizeof(d));memset(b,0,sizeof(b));d[0]=1;scanf("%d",&n);if (n==0) printf("%d",0);else if (n==1) printf("%d",1);else if(n==2)printf("%d",2);else{x=n%3;y=n/3;f=y-1;t=1;k1=k2=1;cons(x,a,b);while(f>1){//快速幂算法if(f&1==1){mul(d,b,k2,k1);if(d[k1+k2-1]!=0){k2=k1+k2;}else{k2=k1+k2-1;};//k2表示d[]数组表示的数的位数}mul(b,b,k1,k1);f=f/2;t=t*2;k1=(int)(t*log10(3.0)+1);//k2表示表示的3^t所表示的数的位数}mul(d,b,k2,k1);if(d[k1+k2-1]!=0){k2=k1+k2;}else{k2=k1+k2-1;};x=0;//最后在*3^y-1乘完之后要成要乘的数for(i=0;i<k2;i++){d[i]=x+d[i]*a[0];x=d[i]/10;d[i]=d[i]%10;}if(x!=0){d[i]=x;}else{i--;}for(i;i>=0;i--){printf("%d",d[i]);}}
}

更多推荐

爱丽丝·玛格特罗依德

本文发布于:2024-02-14 02:32:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1761238.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爱丽丝   格特   罗依德

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!