CCF	201812-2小明放学_#include

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;
}