notice:
-
因为这里 r 、y 、g的范围达到106 ,t=0时耗时 t 也达到106,下面测试点的n也达到105;
所以最坏的情况下达到106x105=1011,不能用int(109以内),得用long long; -
这道题最后两个测试点容易超时,需要考虑对一个周期的取余;
由于本人水平有限,代码存在很多需要改善的地方,请谅解:
一般可以不用STL的我就不会用,除非涉及到超时或者内存过大而只能用STL处理的问题;
这是我的代码:
// #include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
long long r, y, g, total_time = 0, time;
//r=红灯时间;y=黄灯时间;g=绿灯时间;total_time=总共耗时;time=单路口耗时
int n, k;
cin >> r >> y >> g >> n;
while (n--)
{
cin >> k >> time;
if (k == 0)//没有红绿灯 直接加上
total_time += time;
else
{
time -= total_time;//减掉之间所耗的时间 time可正可负
time = time%(r+y+g);//如果time负得很多 通过取余能直接加到负一个周期以内 K不变;如果没有取余 则如果输入大时间而仅用加法加上去肯定超时!
while (time < 0)//得到该灯下的剩余时间
{
if (k == 1)//红灯跳绿灯
{
time += g;//得到绿灯剩余时间
k = 3;
}
else if (k == 2)//黄灯跳红灯
{
time += r;//得到红灯剩余时间
k = 1;
}
else//绿灯跳黄灯
{
time += y;//得到黄灯剩余时间
k = 2;
}
}
switch (k)//此时time必定处在当前k对应灯的时间之内 直接按小明上学的分析 遇绿灯不用管 遇红灯加上红灯剩余时间 遇黄灯加上黄灯剩余和红灯时间
{
case 1:
total_time += time;
break;
case 2:
total_time = total_time + time + r;
break;
case 3:
break;
}
}
}
cout << total_time;
return 0;
}