A60 正经题解
2025-11-21 19:47:00
发布于:广东
7阅读
0回复
0点赞
题意分析
汉诺塔问题,但是每个大小的圆盘都有两个且没有任何区别,求需要移动圆盘多少次才能完成它
解题思路
正常的汉诺塔每个大小只有一个圆盘,我们先从这个开始理解:
设为大小种数,为时的最少次数:
时,。时,……这些数字是有规律的!通过观察可以得出。
回到该问题,时,。时,……看起来不容易找到规律,但是如果观察前后项的关系,我们可以发现:
,,于是我们得出基础解法(放在代码第二个)。
没有,观察数据范围,发现可能达到,至少要位二进制才能承受的起次的乘,考虑高精度加法优化,得到第一个代码(代码第一个)。
虽然已经毫秒了,且该代码在数据范围内已十分接近最优,但是为了水字数尊重一下这道题,我还是希望有神人能写快速幂之类的优化,公式放在这了,,有优化方案的自取。
AC代码
高精度加法递推:
#include <bits/stdc++.h>
using namespace std;
string ans="2";
string add(string a, string b){
int sa = a.size(), sb = b.size();
bool flag=false;
if(sa<sb) swap(a, b);
for(int i=1;i<=sb;++i){
int o1 = a[sa-i]-'0', o2 = b[sb-i]-'0';
a[sa-i] = (o1+o2+flag)%10+'0';
if(o1+o2+flag>9)
flag = true;
else
flag = false;
}
if(flag){
for(int i=sb+1;i<=sa&&flag;++i){
int o1 = a[sa-i]-'0';
a[sa-i] = (o1+flag)%10+'0';
if(o1+flag>9)
flag = true;
else
flag = false;
}
if(flag) a = "1"+a;
}
return a;
}
int main(){
int n;
cin >> n;
for(int i=1;i<n;++i){
ans = add(add(ans, ans), "2");
}
cout << ans;
return 0;
}
无高精度递推:
#include <bits/stdc++.h>
using namespace std;
long long ans=2;
int main(){
int n;
cin >> n;
for(int i=1;i<n;++i){
ans=ans*2+2;
}
cout << ans;
return 0;
}
全部评论 1
沃趣时空双修
3天前 来自 广东
0





有帮助,赞一个