AtCoder Beginner Contest 115-D解题报告

题目

https://atcoder.jp/contests/abc115/tasks/abc115_d

思路

本题是一题精妙的递归题。level-0, level-1, level-2的汉堡分别如下图左、中、右所示:

burger.png

对于level-1汉堡而言,其中的绿色部分即为level-0汉堡。
对于level-2汉堡而言,其中的绿色部分即为level-1汉堡。

做题时,可先把level-n的总层数和对应的P层数都列出来。
然后利用递归来解题。
比如n = 2, x = 7。先把最底部的B层去掉,再计算下半部分的绿色部分,共5层;再计算中间层。此时累计的层数已经达到7层,所以不用计算上半部分的绿色部分和顶部的B层。

具体可参考下面的代码,如果一时无法理解,可以将n = 2, x =1; n = 2, x = 2; n = 2, x = 3; ...; n = 2, x = 13逐一代入代码中去分析。

AC代码

#include<bits/stdc++.h>
using namespace std;

long long burger[52], patty[52];
long long n, x;
long long ans = 0;


void f(int n)
{
    if(x == burger[n]) // 递归终止条件 
    {
        // 测试数据n=2,x=3会进入本分支 
        ans += patty[n];
        return; 
    }
    else if(x < burger[n])
    {
        if(x)   // x>0
        {
            x--;    // 最底下那一层是bun不是patty,减掉 
            if(x > burger[n-1])
            {
                ans += patty[n-1];
                x -= burger[n-1];
                
                // 加上中间那一层的patty 
                ans++;
                x--;
                
                // x > burger[n-1]分为两种情况:
                // 一是x>burger[n-1]+1,这里1指的是中间的patty层,这种情况进下面的if
                // 二是x==burger[n-1]+1,这种情况进下面的else 
                if(x)
                {
                    f(n-1);
                }
                else // x==0是递归终止条件,可以省略不写 
                {
                    // 测试数据n=2,x=4会进入本分支 
                    return;
                } 
                
            }
            else // x<=burger[n-1]
            {
                f(n-1);
            }
        }
        else // x==0是递归终止条件,可以省略不写 
        { 
            // 测试数据n=2,x=1或n=2,x=2会进入本分支 
            return;
        }
    }
}


int main()
{
    scanf("%lld%lld",&n, &x);
    burger[0] = 1, patty[0] = 1;    // 初始化n = 0时 
    
    for(int i = 1; i <= 50; i++)
    {
        // 计算1层~50层的汉堡总层数和对应的patty层数 
        burger[i] = burger[i-1] * 2 + 3; // 汉堡的总层数 
        patty[i] = patty[i-1] * 2 + 1;   // patty层数 
        //cout << "n=" << i << ",汉堡总层数和patty层数:" << burger[i] << ',' << patty[i] << '\n'; 
    }
    
    f(n);
    printf("%lld\n", ans);
    
    return 0;
}

TopCoder & Codeforces & AtCoder交流QQ群:648202993

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 还是放不下,是舍不得,还是不相信自己会遇到更好的?
    Jarvis_C阅读 205评论 0 0
  • 长隆动物园的缆车项目,美其名曰“带游客跨越长隆野生动物世界的青龙白虎山、天鹅湖、熊猫乐园以及东非草原等中心...
    繁星月夜阅读 1,681评论 0 0
  • 下载http://hadoop.apache.org/releases.html 测试ssh是否可以登录ssh: ...
    558f565a3cd7阅读 182评论 0 0