【解题报告】洛谷P1096 Hanoi双塔问题
【解题报告】洛谷P1096 Hanoi双塔问题
题目链接
https://www.luogu.com.cn/problem/P1096
思路
一个普通的汉诺塔的变形问题
策略和普通的一样
上面的 \((n-1) \times 2\) 层先移到B上然后把最后两个移动到C上,最后把B上面的移动到C上
设 \(f[i]\) 表示把 \(2i\) 层完成的步骤
然后就有 \(f[i]=2 \times f[i-1]+2\) 边界是 \(f[1]=2\)
然后发现数据最后比较大,"数据之大,long long装不下"
然后我们加一个高精度就完了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int maxn=2500;
char s[maxn];
struct gaojing{
int n,z[maxn];
gaojing()
{
n=1;
memset(z,0,sizeof(z));
}
void init()
{
scanf("%s",s+1);
int len=strlen(s+1);
reverse(s+1,s+len+1);
n=len;
for(int i=1;i<=n;i++)
z[i]=s[i]-'0';
}
void print()
{
for(int i=n;i>=1;i--)
cout<<z[i];
}
};
gaojing operator+(const gaojing &a,const gaojing &b)
{
gaojing c;
c.n=max(a.n,b.n);
for(int i=1;i<=c.n;i++)
c.z[i]=a.z[i]+b.z[i];
for(int i=1;i<=c.n;i++)
{
c.z[i+1]+=c.z[i]/10;
c.z[i]=c.z[i]%10;
}
if(c.z[c.n+1]!=0) c.n++;
return c;
}
gaojing operator*(const gaojing &a,const gaojing &b)
{
gaojing c;
c.n=a.n+b.n;
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=b.n;j++)
c.z[i+j-1]+=a.z[i]*b.z[j];
}
for(int i=1;i<=c.n;i++)
{
c.z[i+1]+=c.z[i]/10;
c.z[i]=c.z[i]%10;
}
while(c.n!=1&&c.z[c.n]==0) c.n--;
return c;
}
int n;
gaojing f[205];
int main()
{
cin>>n;
gaojing two;
two.n=1;
two.z[1]=2;
f[1]=two;
for(int i=2;i<=n;i++)
f[i]=two*f[i-1]+two;
f[n].print();
return 0;
}
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982