CCF 201812 2(小明放學)

2021-10-02 18:16:23 字數 3650 閱讀 8314

一:問題

1.題目背景

漢東省政法大學附屬中學所在的光明區最近實施了名為「智慧型光明」的智慧型城市專案。具體到交通領域,通過「智慧型光明」終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了「智慧型光明」終端,小明想利用這個終端給出的資訊,估算自己放學回到家的時間。

2.問題描述

一次放學的時候,小明已經規劃好了自己回家的路線,並且能夠**經過各個路段的時間。同時,小明通過學校裡安裝的「智慧型光明」終端,看到了出發時刻路上經過的所有紅綠燈的指示狀態。請幫忙計算小明此次回家所需要的時間。

3.格式

輸入格式

輸入的第一行包含空格分隔的三個正整數 r、y、g,表示紅綠燈的設定。這三個數均不超過 106。

輸入的第二行包含乙個正整數 n,表示小明總共經過的道路段數和路過的紅綠燈數目。

接下來的 n 行,每行包含空格分隔的兩個整數 k、t。k=0 表示經過了一段道路,將會耗時 t 秒,此處 t 不超過 106;k=1、2、3 時,分別表示出發時刻,此處的紅綠燈狀態是紅燈、黃燈、綠燈,且倒計時顯示牌上顯示的數字是 t,此處 t 分別不會超過 r、y、g。

輸出格式

輸出乙個數字,表示此次小明放學回家所用的時間。

4.測試

樣例輸入

30 3 30

80 10

1 50 11

2 20 6

0 33 10

0 3樣例輸出

46樣例說明

小明先經過第一段路,用時 10 秒。第一盞紅綠燈出發時是紅燈,還剩 5 秒;小明到達路口時,這個紅綠燈已經變為綠燈,不用等待直接通過。接下來經過第二段路,用時 11 秒。第二盞紅綠燈出發時是黃燈,還剩兩秒;小明到達路口時,這個紅綠燈已經變為紅燈,還剩 11 秒。接下來經過第

三、第四段路,用時 9 秒。第三盞紅綠燈出發時是綠燈,還剩 10 秒;小明到達路口時,這個紅綠燈已經變為紅燈,還剩兩秒。接下來經過最後一段路,用時 3 秒。共計 10+11+11+9+2+3 = 46 秒。

5.評測用例規模與約定

有些測試點具有特殊的性質:

* 前 2 個測試點中不存在任何訊號燈。

測試點的輸入資料規模:

* 前 6 個測試點保證 n ≤ 103。

* 所有測試點保證 n ≤ 105。

二:理解

題意:就是輸入的資料,是在開始啟程的時候,每條路段需要的時間以及各個紅綠燈的此時的狀態以及剩餘時間。

我們處理這個問題的方法就是:

根據所用時間,來計算此時在紅綠燈處應該是什麼狀態;

cin >> k >> t;

if(k)

t = color[k]

- temp;

//計算還剩下多少時間需要等待 }}

else

count +

= t;

//道路直接加到耗時也可以

1.先將原先紅綠燈的時間消耗掉,然後轉換紅綠燈的狀態:

temp = count - t;

//先跑完目前的紅路燈的狀態

k =change

(k);

//轉換紅綠燈狀態(綠->黃->紅->綠)

2.總將時間縮短為乙個週期:

temp %

= sum;

//將時間壓縮為乙個紅綠燈週期

while

(temp >= color[k]

)

4.將剩餘時間更新一下:

t = color[k]

- temp;

//計算還剩下多少時間需要等待

三:**

#include

#include

#define ll long long

using

namespace std;

intchange

(int k)

intmain()

t = color[k]

- temp;

//計算還剩下多少時間需要等待 }}

else

count +

= t;

//道路直接加到耗時也可以

if(k==1)

//紅燈

count +

= t;

else

if(k==2)

//黃燈

count +

= t + color[1]

;//黃燈剩餘時間+整個紅燈的時間

} cout << count << endl;

return0;

}

第二次寫這個**:

有點蒙,一看原先寫的就「哦…」,原來這麼寫。

而且發現乙個問題,上個**有個問題,就是在花的時間小於給定的紅綠燈的時間的時候,也需要求一下t -= counts;原先那個**沒有,不過提交也對了。

在理解一次吧:

我覺著明白資料結構就可以理解了。

1.用陣列來儲存各個燈的時間,color[4]

2.用乙個函式來轉換燈的狀態

(在心裡預設,color[1]是記錄紅燈的時間,color[2]是記錄黃燈的時間,color[3]是記錄綠燈的狀態)。

int

change

(int k)

對於在紅綠燈處且花費的時間大於給定燈的時間的時候:

我們需要模仿時間的流逝,直至定位到乙個燈。

long

long temp =0;

if(counts >= t)

//耗時多餘自身這個紅綠燈時

t = color[k]

- temp;

//計算需要的剩餘時間

對於在路上的情況:因為什麼時候都是花費這些時間,所以直接加即可。

注意:counts的型別為long long型。

#include

#include

#include

using

namespace std;

intchange

(int k)

intmain()

t = color[k]

- temp;

//計算需要的剩餘時間

}else

t -= counts;

}else

counts +

= t;

if(k ==1)

counts +

= t;

else

if(k ==2)

counts +

= t+color[1]

;}cout << counts << endl;

return0;

}

CCF 201812 2 小明放學

題目大意 這題和第一題的區別在於,小明事先得知路況 路口通過時間和交通燈資料 走之前 估算走多少時間,不再是第一題那樣走多少記多少。思路 由於沒有親自去走,所以需要模擬人去走,得到走的總時間,遇到路口就加時間,遇到交通燈的時候,通過總時間和交通燈在出發時的情況,推算出現在交通燈情況,用現在的交通燈情...

CCF 201812 2小明放學

試題編號 201812 2 試題名稱 小明放學 時間限制 1.0s 記憶體限制 512.0mb 問題描述 題目背景 漢東省政法大學附屬中學所在的光明區最近實施了名為 智慧型光明 的智慧型城市專案。具體到交通領域,通過 智慧型光明 終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了 智慧...

CCF 201812 2小明放學

題目背景 漢東省政法大學附屬中學所在的光明區最近實施了名為 智慧型光明 的智慧型城市專案。具體到交通領域,通過 智慧型光明 終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了 智慧型光明 終端,小明想利用這個終端給出的資訊,估算自己放學回到家的時間。問題描述 一次放學的時候,小明已經規...