(1)题目描述
(2)算法思想
本题作为第二题其实有点难度,要灵活避坑。
- 首先估算数量级,发现可能存在10^11,超出了int型可以表示的范围,因此花费时间及其中间变量需要设置为long long型;
- 其次是时间复杂度的问题,如果采取保存初始时间结点并不断更新的方式,复杂度则为O(n^2),我觉得很可能会超时(不过并没有实际尝试)。
在避开上述比较坑的地方之后我们便可以设计算法了:
- 实现红绿灯1->3->2->1的状态转移(结合前一题的描述),或者初始接收红绿灯时间输入时按照转变顺序接收,之后进行取模运算即可表示状态转移;
- 处理输入的时间结点,我在此处采取的是减去当前总时间,之后取其相反数模红绿灯一周期总时间的负数值的方式,可以快速得到下一状态以及对应剩余时间,如果采取循环每次只减去一次红绿灯的时间会超时,经验证只能够得到80分。
(3)代码实现
#include<iostream>
using namespace std;
int main() {
int sigsum=0;