目录
一、硬币塔
题目:
思路:预处理出每一级的总金币数,和每一级的规模。按照递归的思想进行dfs。
注意特判边界就行了(n可以等于0).
代码:
#include<bits/stdc++.h>
using namespace std;
long long f[45]; //每一级的总金币数.
long long sz[45]; //每一级的规模
long long n,m;
long long res;
void dfs(long long k,long long step){
if(k<=1){
res += 0;
}else if(k>=sz[step-1]+1 && k<=1+sz[step-1]+step){
res += k - 1 - sz[step-1] + f[step-1];
}else if(k>=1+sz[step-1]+step+sz[step-1]){
res += f[step];
}else if(k>1 && k<1+sz[step-1]){
dfs(k-1,step-1);
}else if(k>1+sz[step-1]+step && k<1+sz[step-1]+step+sz[step-1]){
res += step + f[step-1];
dfs(k-1-sz[step-1]-step,step-1);
}
}
int main()
{
sz[0] = f[0] = 1;
cin >> n >> m;
for(int i=1;i<=n;i++) sz[i] = 1 + sz[i-1] + i + sz[i-1] + 1;
for(int i=1;i<=n;i++) f[i] = f[i-1]*2 + i;
// 这个特判看了将近半个小时.
if(n==0 && m==1){