ccf/csp 2018 12 小明放學


試題編號: 201812-2
試題名稱: 小明放學
時間限制: 1.0s
內存限制: 512.0MB
問題描述:
題目背景
  漢東省政法大學附屬中學所在的光明區最近實施了名為“智慧光明”的智慧城市項目。具體到交通領域,通過“智慧光明”終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了“智慧光明”終端,小明想利用這個終端給出的信息,估算自己放學回到家的時間。
問題描述
  一次放學的時候,小明已經規划好了自己回家的路線,並且能夠預測經過各個路段的時間。同時,小明通過學校里安裝的“智慧光明”終端,看到了 出發時刻路上經過的所有紅綠燈的指示狀態。請幫忙計算小明此次回家所需要的時間。
輸入格式
  輸入的第一行包含空格分隔的三個正整數 r、y、g,表示紅綠燈的設置。這三個數均不超過 10 6
  輸入的第二行包含一個正整數 n,表示小明總共經過的道路段數和路過的紅綠燈數目。
  接下來的 n 行,每行包含空格分隔的兩個整數 k、t。k=0 表示經過了一段道路,將會耗時 t 秒,此處 t 不超過 10 6;k=1、2、3 時,分別表示 出發時刻,此處的紅綠燈狀態是紅燈、黃燈、綠燈,且倒計時顯示牌上顯示的數字是 t,此處 t 分別不會超過 r、y、g。
輸出格式
  輸出一個數字,表示此次小明放學回家所用的時間。
樣例輸入
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
樣例輸出
46
樣例說明
  小明先經過第一段路,用時 10 秒。第一盞紅綠燈出發時是紅燈,還剩 5 秒;小明到達路口時,這個紅綠燈已經變為綠燈,不用等待直接通過。接下來經過第二段路,用時 11 秒。第二盞紅綠燈出發時是黃燈,還剩兩秒;小明到達路口時,這個紅綠燈已經變為紅燈,還剩 11 秒。接下來經過第三、第四段路,用時 9 秒。第三盞紅綠燈出發時是綠燈,還剩 10 秒;小明到達路口時,這個紅綠燈已經變為紅燈,還剩兩秒。接下來經過最后一段路,用時 3 秒。共計 10+11+11+9+2+3 = 46 秒。
評測用例規模與約定
  有些測試點具有特殊的性質:
  * 前 2 個測試點中不存在任何信號燈。
  測試點的輸入數據規模:
  * 前 6 個測試點保證 n ≤ 10 3
  * 所有測試點保證 n ≤ 10 5
 【思路】:
    使用一個變量來保存時間,到每個紅綠黃燈的點在來討論情況,先講time % (r + g + y),然后加上余數
    是否會使其燈的狀態發生變化,注意:燈的變化順序為 紅 綠 黃 ,求完余后,可以得到,最多就是變化到當前的
    燈色,所以討論一個< r + g + y的范圍就ok了,注意,單個t可以為1e6  n最大為1e5,所以可以超過int范圍,所以采用
    longlong
附上代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
typedef long long ll;
typedef struct MYINT
{
    ll flag, time;
}myint;
ll r, y, g, n;
myint arr[MAXN];
int main()
{
    while(~scanf("%lld%lld%lld", &r, &y, &g))
    {
        memset(arr, 0, sizeof(arr));
        scanf("%lld", &n);
        for(int i = 0; i < n; i ++)
        {
            scanf("%lld %lld", &arr[i].flag, &arr[i].time);
        }
        ll now = 0;
        for(int i = 0; i < n; i ++)
        {
            if(arr[i].flag == 0)
            {
                now += arr[i].time;
            }
            else if(arr[i].flag == 1)
            {
                ll temp;
                temp = now % (r + g + y);
                if(temp < arr[i].time)
                {
                    now += (arr[i].time - temp);
                }
                else
                {
                    if(temp < arr[i].time + g)
                    {
                        now = now;
                    }
                    else if(temp < arr[i].time + g + y)
                    {
                        now += (arr[i].time + g + y - temp + r);
                    }
                    else
                    {
                        now += (arr[i].time + g + y + r - temp);
                    }
                }
            }
            else if(arr[i].flag == 2)
            {
                ll temp = now % (r + g + y);
                if(temp < arr[i].time)
                {
                    now += (arr[i].time - temp + r);
                }
                else
                {
                if(temp < arr[i].time + r)
                {
                    now += (arr[i].time + r - temp);
                    
                }
                else if(temp < arr[i].time + r + g)
                {
                    now = now;
                }
                else
                {
                    now += (arr[i].time + g + r + y - temp + r);
                }
                }
            }
            else if(arr[i].flag == 3)
            {
                ll temp = now % (r + g + y);
                if(temp < arr[i].time)
                {
                    now = now;
                }
                else
                {
                    if(temp < arr[i].time + y)
                    {
                        now += (r + (y + arr[i].time - temp));
                    }
                    else if(temp < arr[i].time + y + r)
                    {
                        now += (arr[i].time + y + r - temp);
                    }
                    else
                    {
                        now = now;
                    }
                }
            }
        }
        printf("%lld\n", now);
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM