问题标题: 酷町堂:2926 汉诺塔 70分

1
0
已解决
赵逸凡
赵逸凡
初级启示者
初级启示者
#include <bits/stdc++.h>
using namespace std;
unsigned long long f(int n){
    if(n==0)return 0; 
    return 2*f(n-1)+1;
}
int main(){
    int n;
    cin>>n;
    cout<<2*f(n);
    return 0;
} 

这道递归题看起来没问题啊,为什么70分?WA6、7、9这3个点

@王源松 这道题对你来说很简单

 

赵逸凡在2020-08-05 10:42:42追加了内容

???????2分题没有人来回答正解??????


0
0
0
0
0
王俊杰
王俊杰
高级光能
高级光能

可以参考一下程天瑞的思路

使用最少的坚果,当然就是在当前行第一个僵尸踏进家门前塞一个坚果过去

按照从第一行到第六行,时间先的在前 的顺序逐行逐个进行判断

  • 如果换行了,答案加一,标记的时间改为这行第一个出现的时间

  • 如果当前僵尸出现时间减去上一个坚果释放的时间>=60,那就再塞一个坚果过去

PS:样例前两个,当两个时间相减到达60时,等第二个僵尸出来再放坚果的话,脑子已经被吃掉了

只要记好这两条,然后按顺序轮着看一遍就好了

  • 这道题的行数有6行而不是真正的pvz里的5行,我因为找不出这个错误还专门在讨论里发了个帖子……蠢啊
  • 样例中zombie出现的次序是排序好的,但数据不是,所以要sort一下。如果刚学快排可以拿这题练练手。
  • 注释中警告的那处。我们要碾压的最前面的zombie是在第1行,但第1+60=61行的那只zombie还没走上草地,所以那里应该是<而非<=。
  • 主要程序
  • for(int i=1;i<=6;i++) //对每一行分别处理
        {
            int x=1; //从这一行的第一只zombie开始碾压
            while(x<=j[i])
            {
                ans++;
                int x1=x;
                while(t[i][x1]<t[i][x]+60) x1++;
                //碾压所有同时在这一行的zombies!!注意<不能打成<=,否则样例都过不了
                x=x1;
            }
         }

这不是我写的,我只是给你们参考的,不要举报

0
赵逸凡
赵逸凡
初级启示者
初级启示者

@王俊杰 我问的是汉诺塔,跟僵尸有什么关系?

 

0
0
王子健
王子健
初级天翼
初级天翼

采纳我吧,反正没人会

我要回答