这道大递归我一开始就找对了方向,不过了MLE,然后从网上搜索到了一个贼有用的概念——尾递归,即如果递归的下一句就是return且没有返回值或者返回值不含有递归函数则编译器会做优化,不会压入新的函数而是直接把用新函数覆盖原函数,从而大大减少MLE的可能性。这样直接就把125MB+ 的东西变成了0.5MB左右,使得此前减少递归函数的几个int变量以及把int变成short int的这种常量级优化显得毫无意义喽。

所以尾递归真的太有用了,在递归后直接加一句“return;”就直接把问题解决了。特别是对于我这种特喜欢写递归的人,写递归简直太容易了,比循环容易多了。有了尾递归,便是解决了一大隐患。

但是,解决了MLE的问题后变成TLE了仍只有56分,不只下一步怎么做了

然后我把乘2除2用左右移代替掉了,因为题解中都这么做了,看来这优化掉的时间非常之多,在递归函数中效果极好。我便也这么做了,但仍然TLE...

然后尽全力优化了,从TLE1Code改成了TLE2Code,本地运行最大数据的时候用了0.86~0.92s,看来应该是被卡常了,很难受,不知道该怎么进一步优化了,好难想呀。

TLE1-Code

#include <iostream>
using namespace std;
#define mx ((ax+bx-1)>>1)
#define my ((ay+by-1)>>1)
int x,y,k;
void dfsf(int ax,int ay,int bx,int by,int status)
{
if(bx<=ax)
return;
if(bx-ax==1)
{
switch(status)
{
case 1:printf("%d %d %d\n",bx,by,status);break;
case 2:printf("%d %d %d\n",bx,ay,status);break;
case 3:printf("%d %d %d\n",ax,by,status);break;
case 4:printf("%d %d %d\n",ax,ay,status);break;
}
return;
}
dfsf(((ax+mx-1)>>1)+1,((ay+my-1)>>1)+1,(mx+bx)>>1,(my+by)>>1,status);
if(status!=1)dfsf(ax,ay,mx,my,4);
if(status!=2)dfsf(ax,my+1,mx,by,3);
if(status!=3)dfsf(mx+1,ay,bx,my,2);
if(status!=4)dfsf(mx+1,my+1,bx,by,1);
return;
}
void dfsg(int ax,int ay,int bx,int by)
{
if(ax>=bx&&bx>=by)return;
if(x>mx&&y>my)
{
dfsf(ax,ay,bx,by,4);
dfsg(mx+1,my+1,bx,by);
return;
}
else if(x>mx&&y<=my)
{
dfsf(ax,ay,bx,by,2);
dfsg(ax,my+1,mx,by);
return;
}
else if(x<=mx&&y>my)
{
dfsf(ax,ay,bx,by,3);
dfsg(ax,my+1,mx,by);
return;
}
else
{
dfsf(ax,ay,bx,by,1);
dfsg(ax,ay,mx,my);
return;
}
}
int main()
{
scanf("%d%d%d",&k,&x,&y);
dfsg(1,1,1<<k,1<<k);
return 0;
}

TLE2-Code

#include <iostream>
//#pragma GCC optimize(2)
using namespace std;
int x,y,k;
void write(int x)
{
static int sta[35];
int top = 0;
do
{
sta[top++] = x % 10, x /= 10;
}while (x);
while (top) putchar(sta[--top] + 48); // 48 是 '0'
}
void dfsf(int ax,int ay,int bx,int by,char status)
{
if(bx<=ax)
return;
if(bx-ax==1)
{
switch(status)
{
case '1':write(bx);putchar(' ');write(by);putchar(' ');putchar(status);putchar('\n');break;
case '2':write(bx);putchar(' ');write(ay);putchar(' ');putchar(status);putchar('\n');break;
case '3':write(ax);putchar(' ');write(by);putchar(' ');putchar(status);putchar('\n');break;
case '4':write(ax);putchar(' ');write(ay);putchar(' ');putchar(status);putchar('\n');break;
}
return;
}
const int mx=(ax+bx-1)>>1,my=(ay+by-1)>>1;
dfsf(((ax+mx-1)>>1)+1,((ay+my-1)>>1)+1,(mx+bx)>>1,(my+by)>>1,status);
if(status!='1')dfsf(ax,ay,mx,my,'4');
if(status!='2')dfsf(ax,my+1,mx,by,'3');
if(status!='3')dfsf(mx+1,ay,bx,my,'2');
if(status!='4')dfsf(mx+1,my+1,bx,by,'1');
return;
}
void dfsg(int ax,int ay,int bx,int by)
{
if(ax>=bx&&bx>=by)return;
const int mx=(ax+bx-1)>>1,my=(ay+by-1)>>1;
if(x>mx&&y>my)
{
dfsf(ax,ay,bx,by,'4');
dfsg(mx+1,my+1,bx,by);
return;
}
else if(x<=mx&&y>my)
{
dfsf(ax,ay,bx,by,'3');
dfsg(ax,my+1,mx,by);
return;
}
else if(x>mx&&y<=my)
{
dfsf(ax,ay,bx,by,'2');
dfsg(ax,my+1,mx,by);
return;
}
else
{
dfsf(ax,ay,bx,by,'1');
dfsg(ax,ay,mx,my);
return;
}
}
int main()
{
scanf("%d%d%d",&k,&x,&y);
dfsg(1,1,1<<k,1<<k);
return 0;
}

P1228-递归【黄】的更多相关文章

  1. "递归"实现"约瑟夫环","汉诺塔"

    一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...

  2. javascript memoization递归优化

    memoize优化递归 function createRec(callback, cache) { cache = cache || []; var rec = function(n) { (n in ...

  3. 递归:汉诺塔 - 零基础入门学习Python024

    递归:汉诺塔 让编程改变世界 Change the world by program 似乎谈到递归算法就要拿汉诺塔来举例,没办法,因为小甲鱼小时候太笨了,这个游戏老是玩不过关,好不容易在自学编程的时候 ...

  4. 化繁为简 经典的汉诺塔递归问题 in Java

    问题描述   在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑 ...

  5. <经验杂谈>介绍Js简单的递归排列组合

    最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...

  6. 洛谷P1228 分治

    https://www.luogu.org/problemnew/show/P1228 我真傻,真的,我单知道这种题目可以用dfs剪枝过,没有想到还能构造分治,当我敲了一发dfs上去的时候,只看到一个 ...

  7. python基础11_函数作用域_global_递归

    看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...

  8. py-day3-2 python 函数递归

    # 递归 def calc(n): print(n) if int(n/2) == 0: return n res = calc(int(n/2)) return res res = calc(10) ...

  9. python_06 函数、全局变量与局部变量、函数递归

    函数 1.函数的定义: def 函数名(参数): #解释函数的功能 代码块 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行 ...

  10. 洗礼灵魂,修炼python(26)--编程核心之“递归”

    递归 1.什么是递归: 其实前面都提过,但没有详细讲.多次调用自身就叫递归 看图,这种就叫递归 看过盗梦空间没?其实也是递归 2.递归需要满足条件: 有调用函数自身 有一个正确的返回条件来结束 在使用 ...

随机推荐

  1. ClickHouse(18)ClickHouse集成ODBC表引擎详细解析

    目录 创建表 用法示例 资料分享 参考文章 ODBC集成表引擎使得ClickHouse可以通过ODBC方式连接到外部数据库. 为了安全地实现 ODBC 连接,ClickHouse 使用了一个独立程序 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (159)-- 算法导论12.3 6题

    六.用go语言,当 TREE-DELETE 中的结点 z 有两个孩子时,应该选择结点 y 作为它的前驱,而不是作为它的后继.如果这样做,对 TREE-DELETE 应该做些什么必要的修改?一些人提出了 ...

  3. Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析

    学习基础知识 掌握 Go 语言的常见概念,如变量.循环.条件语句.函数.数据类型等等.深入了解 Go 基础知识的好起点是查阅 Go 官方文档 文章链接:Go 编程语言详解:用途.特性.与 Python ...

  4. 华企盾DSC客户端图标不显示常见处理方法

    1.检查是否启用了360桌面.猎豹桌面之类的(兼容腾讯桌面),打强制显示客户端图标的补丁 2.是否被杀毒软件查杀 3.用Autoruns查看explorer项图标那一栏前10个是否有我们图标没有的话把 ...

  5. NTP时间服务器优先级介绍

    先思考一个问题:当一个客户端配置向多个NTP时间服务器校时,此时客户端优先向哪个时间服务器同步时间呢? 一个完整的NTP校时请求分四步: 1.客户端向服务器发起校时请求 2.服务器收到客户端发送的校时 ...

  6. idea2020下载、安装、破解、配置

    idea2020下载.安装.破解.配置 idea2020下载 [推荐]官方下载地址:https://www.jetbrains.com/idea/download/other.html 进入后往下找, ...

  7. Python——第一章:数据类型介绍

    数据类型: 区分不同的数据.不同的数据类型应该有不同的操作 数字: 做加减乘除+-*/ 整数,int 小数,float a= 10 #整数 b = 20 print(a + b) #加法运算 c = ...

  8. linux文件和文件夹的筛选、查找及用户和组管理命令

    1.列出当前系统上所有已经登陆的用户的用户名, 注意:同一个用户登录多次,则只显示一次即可. 查看系统用户的命令为: (1)getent passwd 查看系统上的所有用户信息 (2)w 查看登录用户 ...

  9. 2023-09-05:请用go语言编写。一个图像有n个像素点,存储在一个长度为n的数组arr里, 每个像素点的取值范围[0,s]的整数, 请你给图像每个像素点值加上一个整数k(可以是负数), 像素值会

    2023-09-05:请用go语言编写.一个图像有n个像素点,存储在一个长度为n的数组arr里, 每个像素点的取值范围[0,s]的整数, 请你给图像每个像素点值加上一个整数k(可以是负数), 像素值会 ...

  10. three.js中帧缓存的使用

    目录 1. 概述 2. 示例 2.1. 代码 2.2. 解析 3. 参考 1. 概述 在网上查阅了一下three.js关于帧缓存的使用,感觉很多都是关于three.js中后处理通道的使用的.后处理通道 ...