洛谷:P1161:开灯


洛谷:P1161:开灯

Table of Contents

题目

P1161:开灯

分析

这道题出现在“数组”章节,但是强烈不要用数组去解!因为题目说:\(t_i\times a_i\)可以到2,000,000。如果用int来存放每个位置的开关情况,那么这个数组的大小可能达到8MB,已经接近Linux系统下栈大小的上限。

这里的一个技巧是用“异或”进行运算:

a ^ a = 0
a ^ 0 = a

已知:所有的灯一开始都是关着的。因此,如果a这个位置的灯开关的次数是偶数次,那么最后一定是关着的;如果a这个位置的灯开关的次数是奇数次,那么最后一定是开着的。

同时,题目保证最后只有一盏灯开着,所以从0开始,执行完题目中要求的所有操作后,结果就一定是那盏唯一开着的灯了!

答案

Solution

思考

作为测试,我用bool数组来存储所有灯的状态,也通过了提交。

从提交的结果来看,数组法和异或法的运行速度差不多,都是50ms数量级。但内存消耗分别是2.47 MB和828KB,前者是后者的三倍。

同时,如果题目中约定\(a_i\times t_i\)的上限更高,数组法占用的内存会更大,很可能会出现栈溢出的问题。

Previous Next