题目
分析
这道题出现在“数组”章节,但是强烈不要用数组去解!因为题目说:\(t_i\times a_i\)可以到2,000,000。如果用int来存放每个位置的开关情况,那么这个数组的大小可能达到8MB,已经接近Linux系统下栈大小的上限。
这里的一个技巧是用“异或”进行运算:
a ^ a = 0
a ^ 0 = a
已知:所有的灯一开始都是关着的。因此,如果a这个位置的灯开关的次数是偶数次,那么最后一定是关着的;如果a这个位置的灯开关的次数是奇数次,那么最后一定是开着的。
同时,题目保证最后只有一盏灯开着,所以从0开始,执行完题目中要求的所有操作后,结果就一定是那盏唯一开着的灯了!
答案

思考
作为测试,我用bool数组来存储所有灯的状态,也通过了提交。
从提交的结果来看,数组法和异或法的运行速度差不多,都是50ms数量级。但内存消耗分别是2.47 MB和828KB,前者是后者的三倍。
同时,如果题目中约定\(a_i\times t_i\)的上限更高,数组法占用的内存会更大,很可能会出现栈溢出的问题。
