CSP 2018年12月 小明放學

CSP 201812-2 小明放學

我的CSP代碼倉庫:https://github.com/Joke-Lin/CSP

CSP題解目錄:https://blog.csdn.net/qq_40953281/article/details/86035679

問題描述

試題編號: 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。

題目本身並不難,和第一題就是需要單獨重新判斷以下當前的紅綠燈狀態。

題目中唯一需要注意的一點就是溢出判斷,因爲測試點規模爲 10^5 * 10^6已經超出int類型的範圍了

所以採取long long類型

還需要注意題目的紅綠黃順序,。。。迷

#include <iostream>
#include <cstdio>
#include <memory.h>

//#define LOCAL

using namespace std;
long long r,y,g;  // 1:紅燈 2:黃燈 3:綠燈

// 輸入紅綠燈原來狀態,以及時間,以及經過的時間,返回需要等待的時間
long long stayTime(long long state, long long timeTo, long long timeLast) {
    long long timeTemp;
    if(state == 1) timeTemp = r-timeTo;
    else if(state == 2) timeTemp = r+y+g - timeTo;
    else if(state == 3) timeTemp = r+g - timeTo;
    long long timeNow = (timeLast+timeTemp) % (r+g+y);
    if(timeNow < r) return r-timeNow;
    else if(timeNow >= r && timeNow < r+g) return 0;
    else if(timeNow >= r+g) return r+y+g - timeNow + r;
}

int main()
{
#ifdef LOCAL
    freopen("./in.txt","r",stdin);
    freopen("./out.txt","w",stdout);
#endif
    scanf("%lld%lld%lld",&r,&y,&g);
    long long res = 0;
    long long n; scanf("%lld",&n);
    for(long long i = 0;i < n;i++) {
        long long kind, clocks; scanf("%lld%lld",&kind,&clocks);
        if(kind == 0) {
            res += clocks;
            continue;
        }
        long long tempTime = stayTime(kind,clocks,res);
        res += tempTime;
    }
    printf("%lld",res);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章