一次由 System.out.println() 引起的 MLE&TLE

C++-时间复杂度 在C++中,常见的时间复杂度包括常数级别O(1)、对数级别O(logn)、线性级别O(n)、平方级别O(n2)、立方级别O(n3)等。其中,常数级别是最快的,而立方级别是最慢的。当然,在实际应用中,我们需要选择合适的算法来降低时间复杂度。在竞赛中,一般算机一秒能运行。立方级别:通常是三层嵌套循环的形式,所需计算时间随着问题规模的增加呈立方级别增长。平方级别:通常是嵌套循环的形式,所需计算时间随着问题规模的增加呈平方级别增长。线性级别:随着问题规模增加,所需计算时间也呈线性增长,如遍历一个数组等。 阅读详情

莫名其妙 MLE

  笔者并非 ACM 选手,但是由于最近备考 CCF 认证需要练练手,笔者是忠实的 Java 选手,于是就打算使用 Java 进行考试。随机到一道题 P5461 赦免战俘,看题第一感觉就是递归处理,不出意外的成功写出了递归解法,然后高高兴兴的就在 OJ 上提交,然后就是莫名其妙的 MLE。

原始代码:

// 递归函数
public static void f(int[][] a, int x1, int x2, int y1, int y2) {
	if (x2-x1==1 && y2-y1==1) {
		a[x1][y1] = 0;
		return;
	} else {
		for (int i = x1; i <= (x2-x1)/2+x1; ++i) {
			for (int j = y1; j <= (y2-y1)/2+y1; ++j) {
				a[i][j] = 0;
			}
		}
		f(a, (x2-x1)/2+x1+1, x2, y1, (y2-y1)/2+y1);
		f(a, x1, (x2-x1)/2+x1, (y2-y1)/2+y1+1, y2);
		f(a, (x2-x1)/2+1+x1, x2, (y2-y1)/2+1+y1, y2);
	}
}

第一次尝试结果:
在这里插入图片描述

第一次思考

  因为使用的是 int 类型的二维数组,而题目明确只需要存储 0 和 1。于是理所当然的想到将 int[ ][ ] 改为 byte[ ][ ],于是进行第二次尝试。

第一次改进代码:

// 更改后的递归函数
public static void f(byte[][] a, int x1, int x2, int y1, int y2) {}

第二次尝试结果:
在这里插入图片描述

第二次思考

  第二次尝试仍然没有解决问题,证明问题不是出在那里,看来得另辟蹊径了。 难道是递归深度太深导致爆内存? 于是决定改进算法,仔细观察题目给出样例,发现数据有规律,类似于杨辉三角,数据依赖于该数上方和右上方的数(eg. a[2][3] = (a[1][3] + a[1][4]) % 2,也就是不进位的加法,可以使用异或优化计算,所以可以优化为 a[2][3] = a[1][3] ^ a[1][4]),于是将原有代码全部推倒从头再来,经过一番努力终于完成新算法,于是进行第三次尝试。

第二次改进代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		byte[][] a = new byte[2048][2048];
		n = (1<<n); // 等价于 n = Math.pow(2, n); 
		a[0][n+1] = 1;// 需要一个初始化数
		
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				// 等价于 a[i-1][j] = (a[i-1][j] + a[i-1][j+1]) % 2;
				a[i][j] = (byte)(a[i-1][j] ^ a[i-1][j+1]);
				System.out.printf("%d ", a[i][j]);
			}
			System.out.println();
		}
		in.close();
	}
}

第三次尝试结果:
在这里插入图片描述

第三次思考

  如此简洁的代码怎么可能 MLE 呢?数组占用内存很小,计算使用位运算优化,没道理会 MLE,唯一可能的就是 IO 产生的内存占用了,于是开始测试自己的想法,每次输出完后调用 System.gc(); 处理一下垃圾。

第三次改进代码:

for (int i = 1; i <= n; ++i) {
	for (int j = 1; j <= n; ++j) {
		a[i][j] = (byte)(a[i-1][j] ^ a[i-1][j+1]);
		System.out.printf("%d ", a[i][j]);
	}
	System.out.println();
	System.gc();// 测试是否 IO 引起的爆内存
}

第四次尝试结果:
在这里插入图片描述

第四次思考

  可以发现 MLE 的问题解决了,证明确实是 IO 引起的爆内存,但是由于 System.gc(); 消耗时间太多又导致了 TLE,于是决定控制 System.gc(); 先把题目 AC 了再说。但是经过多次调试都无法平衡时间和空间,要么 TLE 要么 MLE。

第五次尝试结果:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第五次思考

  无法取巧通过测试,就只能另辟蹊径了,突然想到输出文件的时候都需要一个缓冲区,平时都没怎么注意这个问题,存在即合理,官方这么做必要有它的道理。于是查看源码以及搜集资料。
  发现 System.out.println(); 是一个同步方法,有一定的开销,在高并发的情况下,会严重影响性能,但这并不是主要问题。更多的是添加字符到缓冲区和打印的开销,这才是导致我的代码 MLE 的原因,因为我的代码每次只输出一个数字,而且产生很多次调用,产生极大开销。于是决定改用缓冲区暂存输出结果,最后输出结果。

使用 PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
代替 System.out.println();

最终代码:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(new BufferedInputStream(System.in));
		PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
		int n = in.nextInt();
		byte[][] a = new byte[2048][2048];
		n = (1<<n);
		a[0][n+1] = 1;
		
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				a[i][j] = (byte)(a[i-1][j] ^ a[i-1][j+1]);
				out.append(Byte.toString(a[i][j]));
				out.append(" ");
			}
			out.append("\n");
		}
		out.flush();
		out.close();
		in.close();
	}
}

最终结果:
在这里插入图片描述

总结

  • 使用 System.out.println() 进行标准输出时,开销较大,不适合频繁调用。
  • 同理,Scanner(System.in) 也不适合频繁调用(一次由 Scanner(System.in) 引起的 TLE)。
  • 频繁输入调用使用 StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  • 频繁输出调用使用 PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
  • 可手动调用 flush() 方法输出缓冲区,但是过于频繁的调用也有可能引发 TLE。
  • 一般情况下,使用传统的 System.out.println(); 我觉得足以应付,遇到频繁输出时再使用改进方法。当然为了防止输出问题导致 TLE&MLE 的话,可以直接使用 PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out)); 记得在最后调用 flush() 方法清空缓冲区,不然会输出不了结果。
  • 最后记得关闭输入输出流,养成一个好习惯,这样即使忘记清空缓冲区,也会因为关闭输出流而自动清空缓冲区。
详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解 最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率估计(Maximum a posteriori estimation, 简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很容易弄混它们。下文将详细说明MLE和MAP的思路与区别。 但别急,我们先从概率和统计的区别讲起。 概率和统计是一个东西吗? 概率(probabilty)和统... 阅读详情

相关推荐

TikTok滑块验证码verifyV2逆向实战:从fp生成到captchabody加密的完整流程解析

本文详细解析了TikTok滑块验证码verifyV2的逆向工程全流程,从fp参数生成到captchabody加密机制,涵盖了验证码触发、WASM解密、轨迹模拟等关键技术点。通过实战案例和代码示例,帮助开发者深入理解反爬机制,提升逆向工程能力,应对复杂的验证挑战。

weixin_28568819的博客 477

浅讲递归

递归的定义 递归就是指在函数的定义中使用函数自身的方法。 优点 递归可以把问题变得更简单,让路径更为清晰,使代码更为简洁明了。 递归的思想 就是有来有回,它和循环不一样,循环一旦开始就不会回头,到了某个条件时,循环会跳出。但是递归是到了某个条件时会再走回去,并不会立即结束。 如下面这张图,我们可以很明了的知道递归的基本思想。 注意 在我们使用递归时,我们必须明确终止条件,要不然他就会无线“递”下去,就买办法回来了。 可以使用递归的问题 1,阶乘; 2,斐波那契数列; 3,杨辉三角; 4,回文字符串的判断;

qq_45709386的博客 231

使用HFSS仿真分支波导耦合器

本文介绍了分支波导耦合器的HFSS仿真设计过程。首先给出了器件关键参数(t=0.365mm,l=1.600mm等),详细说明了建模步骤:包括创建中心分支、设置变量参数、镜像复制两侧分支、矩形波导端口设计等操作。重点阐述了激励端口设置方法,包括四个端口的积分线绘制,以及求解频率设定。最后展示了S参数、幅度平衡度和相位差等关键性能指标的仿真结果提取方法。整个设计过程体现了HFSS在微波器件仿真中的参数化建模和结果分析能力。

shao666888的博客 180

c++算法之递归

1.确保递归一定能到递归出口,避免无限递归,这可能导致TLE(超时)、MLE(超内存)或RE(运行错误)。递归函数的一个条件,当满足该条件时,递归终止,避免无限递归。递归函数中的语句,用于解决规模更小的子问题,再将子问题的答案合并成为当前问题的答案。在for循环中for(i=1;首先,初始状态a[1]=n,拿n=6来说,dfs(2)进入后。2、适用于问题的规模没有明显的缩减,或者需要特定的迭代次数。输入n,求F(n),n<100000,结果对le9+7取模。n>3时F(n)=F(n-1)+F(n-2)

weixin_63201442的博客 952

Zemax操作40--序列模式中LD光源模拟

LD模拟

lzy750750的博客 9118

【2026最新版】Open3D(C++)点云处理算法汇总(C++长期更新版)

C++版本Open3D进行点云处理的一些算法使用案例。博客长期更新,最近一次更新时间为:2026年4月11日。

点云侠的博客 1万+

信息学竞赛中AC、WA、RE、CE、TLE、MLE、PE、OLE、分别什么意思

信息学竞赛中AC、WA、RE、CE、TLE、MLE、PE、OLE、分别什么意思 ‌AC Accepted 答案正确/通过 ‌WA Wrong Answer 答案错误 RE Runtime Error 运行时错误 这表明你的程序在运行过程中因为出锅而崩溃了,通常可能是访问非法内存等问题,出现这个提示但你还能过样例的话,大概率是数组没开够,仔细检查一下。 CE Complie Error 编译错误 这表明你的程序没有通过编译。如果在本地编译可以通过的话,检查一下提交语言是不是选对了或是有没有引用一些不该引用的东

Annie_bing的博客 4万+

EM的理论与实践(基础篇)

EM理论与实践

m0_61544122的博客 2379

最大似然估计程序c语言,萌新笔记——Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))...

在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习。理解颇浅,还请大神指点!它的基本处理方法和上篇中用bitmap统计的方法类似,但是最后要用到一个公式:说明:m为bitmap总位数,u为0的个数,最后的结果为n的一个估计,且为最大似然估计(MLE)。那么问题来了,最大似然估计是什么东东?好像在学概率论的时候听说过,于是又去搜索了一下MLE的信息。MLE:(此处不使...

weixin_31953847的博客 785

SAP Joule 在顾问与开发者场景的双擎定位:Joule for Consultants 与 Joule for Developers 全面解读

SAP推出企业级AI助手Joule,分为顾问版(Joule for Consultants)和开发者版(Joule for Developers)两个版本。顾问版聚焦咨询业务,整合SAP知识库和方法论,辅助方案设计、差距分析和实施落地;开发者版嵌入开发工具链,支持代码生成、解释、测试和迁移。两者共享智能底座但面向不同场景:顾问版优化项目交付流程,开发者版提升工程效率。典型案例显示,Joule能有效缩短云转型周期,实现从业务咨询到技术落地的无缝衔接。该产品通过AI代理和知识图谱技术,为企业数字化转型提供端到端

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 351

自动驾驶---Planning模块详细介绍(以Apollo为例)

主要介绍高速场景下Planning模块,至于低速的泊车场景对比高速场景或者城区场景有比较大的差距(后面也会介绍泊车场景),本篇Planning介绍主要包括三大子模块Routing,Behavioural Planning以及Motion Planining,并且对比较重要的Decider和Optimizer都做了通俗化的说明供大家思考,以便于后续理解更深入的内容,后面有时间会再开一些篇幅对这些模块进行更加深入的讲解。

智能汽车人的博客 2084

【转】ACM各种WA的说明及可能的原因

转载地址:ACM各种WA的说明及可能的原因_ROOM-优快云博客_mle的原因 1、答案错误 ——wrong answer 就是最常见的。这个没办法,基本是程序有些细节的点没有考虑到。 2、运行错误 ——Runtime Error 大致两种情况 1、是数组开太小,要存的数据太大,数组调大就OK了。 2、是数组发生越界操作,基本上是程序执行时访问到了不该访问的地方,程序问题了。 3、格式错误 ——presentation error 非常接近AC了。空格或者回车多输或者少输了。看题意再检查下..

weixin_51472673的博客 1206

【KingSCADA】如何创建新应用

KingSCADA3.8集成开发环境是基于工程的应用管理模式,实现了对多个应用的集中开发和管理的功能,一个工程可以同时管理多个应用,即在KingSCADA3.8工程设计器中可以同时对多个应用进行开发,应用之间可以实现相互复制、粘贴等功能,大大提高了开发效率。(此处感觉和VS类似)使用KingSCADA3.8开发的系统称为应用,一个完整的应用一般包含以下部分或全部内容:IO设备、IO采集点、图形界面、动画链接、趋势曲线、报警和事件、历史记录、数据库、Web Server等部分。

做有价值的事,积累有价值的笔记! 3107

*分享-神奇的MLE原因-为什么结构体开的内存不大却MLE?用数组开更大还能ac???

今天写了一道题,ac之后想看一下我的代码数据量最大可以开到多少。 出乎意料的是,我把结构体数据稍开大一点就MLE??? 非常不解,在网上找了别人的代码测试一下,结构就出现了下面的情况。 ps:xjb数组是测试用的,没啥用。。。但是居然还是ac了。 十分不解。虽然说知道结构体是内存对齐储存。 但是也不应该出现这种情况呀??第二段代码开longlong都没事啊? 大佬说可...

打过ICPC/CCPC,学习ACM算法,Linux内核,Openharmony,加油努力开心珍惜 7653

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++常见错误

这一结果的可能性非常多,常见的有段错误(直接的原因时非法访问了内存,例如数组越界,指针乱指),浮点错误(例如除数为0,模数为0),递归爆栈(一般由递归时层数过深导致的)等。一般来说,需要先检查数组大小是否比题目的数据范围大,然后再去检查可不可能有特殊数据可以使除数或者模数为0,有递归的情况则检查是否在大数据时递归层数太深。如果程序输出了过量的内容(一般是指过量非常多),那么就会返回OLE。每道题目都有规定程序使用的空间上限,因此如果程序中使用太多的空间,则会返回MLE,例如数组太大一般最容易导致这个结果。

ny_zhy_sort的博客 1303

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java 解决运行超时TLE,MLE,从入门到入坑完整版

1、用BufferedReader替换Snanner作为输入 class Reader { static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tokenizer = new StringTokenizer(""); static String nextLine() throws IOException{// 读取下一行字符串 retu

double_app_le的博客 2391

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

刷题术语简称:OJ、AC、WA、TLE、OLE、MLE、RE、PE、CE分别代表的意思

刷题术语简称:OJ、AC、WA、TLE、OLE、MLE、RE、PE、CE分别代表的意思

weixin_51916266的博客 8904

信息学竞赛中常用名词

信息学竞赛中AC、WA、RE、CE、TLE、MLE、PE、OLE、分别什么意思。

厚积而薄发 4383

一些导致 WA/MLE/TLE 的坑点

本文总结了几个算法竞赛中常见的错误与优化技巧:1.避免使用pow函数计算快速幂以防精度问题;2.节点数多时应使用链式前向星而非vector存图防MLE;3.bool类型不能用%d输入;4.关闭同步流时避免使用递归快写函数;5.注意点双和边双处理时的特殊要求;6.警惕自增运算符在复杂表达式中的使用顺序问题。这些经验教训来自洛谷多道题目的WA/TLE/MLE测试案例。

Bree0307的博客 717

C++中AC、WA、RE、CE、TLE、MLE、PE、OLE的意思

这表明你的程序所调用的内存大小超出了测试点的内存限制,可能是算法的空间复杂度不是很优秀,要优化!可能是访问越界,除以0,或者是非void类型的函数没有返回值。那就是时间复杂度超出了题目限制,需要优化,或者是进入死循环了。那就是你的语法错误了,要在编译器中运行一下。没什么好说的,修改一下格式,按照题目要求。这我没遇到过,应该也是死循环。请各位大佬为我提出建议!这张图片可以让你秒懂AC。

sbsbsbnc的博客 1108

【心得:平衡选根+释放内存】由于深搜单链导致MLE的微优化

补充 该做法只是一个对堆栈内存的微优化,最多也只能节省 n2\frac{n}{2}2n​ 个 堆栈单位的临时储存空间。 如果不是 nnn 到了 1e61e61e6 级别然后差 2∼5Mb2\sim 5Mb2∼5Mb 而 MLEMLEMLE 的话,该优化效果差别不大。 当然也有评测机玄学的因素。。 题目 【题目】[POI2006]MET-Subway 就是给你一个 nnn 节点的树,用 lll 条路径最多覆盖多少个点? 这题之前不是做过吗?再写一遍练练手啥的… 【范围】 1≤k≤n≤1061\le k

溢流眼泪的博客 836

C++手写非线性优化方法: GN & LM & DL,对比测试

C++实现非线性优化方法,高斯牛顿法GN和列文伯格-马夸尔特法LM、狗腿法DL

啥也不懂的研究生也淦SLAM的博客 1744

C++基础六:C++入门知识、黑盒测试(详解)与复杂度

C++基础六:C++入门知识、黑盒测试(详解)与复杂度

weixin_63026364的博客 1096

针对于MLE和MLP的代码例子实现

在机器学习和模式识别中,极大似然估计和最大后验概率都对于其理解起到了很大的作用。本文建立在文中给出博客文章的基础上,通过python实现了文中所给例子,对于其理解有一定的作用。

m0_50845934的博客 511

洛谷 P1003 [NOIP2011 提高组] 铺地毯 (如何解决MLE?)

洛谷 P1003 [NOIP2011 提高组] 铺地毯 (如何解决MLE?)

Sonaldo的博客 485

c++查看程序静态内存

由于CSPCSPCSP最有把握也是期望得分最高的一道题因为MLEMLEMLE挂零了,所以学了一手如何查询程序静态内存 在所有变量定义之前先设定一个charcharchar类型变量,此时指向的地址就是程序最开头的内存地址,同理在最后也设定一个,指向所有变量之后存储的内存地址,两个地址相减得到了占用的内存字节。一般看程序内存都是MMM为单位,所以转换一下/1024/1024/1024/1024/1024/1024就好了。 #include <bits/stdc++.h> using namespa

Young_Zn_Cu 903
上一篇: 听说这玩意可以验证消息完整性 —— 消息认证码(MAC)
下一篇: 一次由 Scanner(System.in) 引起的 TLE
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值