本題得分:60分
題目背景
漢東省政法大學附屬中學所在的光明區最近實施了名為“智慧光明”的智慧城市項目。具體到交通領域,通過“智慧光明”終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了“智慧光明”終端,小明想利用這個終端給出的信息,估算自己放學回到家的時間。
問題描述
一次放學的時候,小明已經規划好了自己回家的路線,並且能夠預測經過各個路段的時間。同時,小明通過學校里安裝的“智慧光明”終端,看到了
出發時刻路上經過的所有紅綠燈的指示狀態。請幫忙計算小明此次回家所需要的時間。
輸入格式
輸入的第一行包含空格分隔的三個正整數 r、y、g,表示紅綠燈的設置。這三個數均不超過 10
6。
輸入的第二行包含一個正整數 n,表示小明總共經過的道路段數和路過的紅綠燈數目。
接下來的 n 行,每行包含空格分隔的兩個整數 k、t。k=0 表示經過了一段道路,將會耗時 t 秒,此處 t 不超過 10 6;k=1、2、3 時,分別表示 出發時刻,此處的紅綠燈狀態是紅燈、黃燈、綠燈,且倒計時顯示牌上顯示的數字是 t,此處 t 分別不會超過 r、y、g。
輸入的第二行包含一個正整數 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
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。
* 前 2 個測試點中不存在任何信號燈。
測試點的輸入數據規模:
* 前 6 個測試點保證 n ≤ 10 3。
* 所有測試點保證 n ≤ 10 5。
程序思想:
在此處t數組指的是出發時刻紅綠燈的剩余時間,所以轉換思維,將剩余實際按轉變為紅綠燈在出發時已經走過的時間。sum=r+g+y代表一次交通變化燈的循環時間。用time代表所需時間,紅綠燈在出發時刻走過的時間+小明到達該此處的所需時間的總值對sum進行取余,對余數v進行判斷,如果余數在紅燈時間內,則計算time+r-v。如果余數在綠燈范圍內,則time保持不變;如果余數在黃燈時間內,則time+sum-v+r。
程序代碼:
#include <iostream>
#define N 1000
using namespace std;
#define N 1000
using namespace std;
int main()
{
int r,y,g,n,k[N],t[N],time=0,sum,v;
cin>>r>>y>>g;
sum=r+y+g;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>k[i]>>t[i];
}
for(int i=1; i<=n; i++)
{
if(k[i]==0)
{
time+=t[i];
}
if(k[i]==1)
{
v=(r-t[i]+time)%sum;
if(v>=0&&v<r)
{
time=r-v+time;
}
if(v>=(r+g)&&v<(r+y+g))
{
time=r+sum-v+time;
}
}
if(k[i]==2)
{
v=(sum-t[i]+time)%sum;
if(v>=0&&v<r)
{
time=r-v+time;
}
if(v>=(r+g)&&v<(r+y+g))
{
time=r+sum-v+time;
}
}
if(k[i]==3)
{
v=(r+g-t[i]+time)%sum;
if(v>=0&&v<r)
{
time=r-v+time;
}
if(v>=(r+g)&&v<(r+y+g))
{
time=r+sum-v+time;
}
}
}
cout<<time;
}
{
int r,y,g,n,k[N],t[N],time=0,sum,v;
cin>>r>>y>>g;
sum=r+y+g;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>k[i]>>t[i];
}
for(int i=1; i<=n; i++)
{
if(k[i]==0)
{
time+=t[i];
}
if(k[i]==1)
{
v=(r-t[i]+time)%sum;
if(v>=0&&v<r)
{
time=r-v+time;
}
if(v>=(r+g)&&v<(r+y+g))
{
time=r+sum-v+time;
}
}
if(k[i]==2)
{
v=(sum-t[i]+time)%sum;
if(v>=0&&v<r)
{
time=r-v+time;
}
if(v>=(r+g)&&v<(r+y+g))
{
time=r+sum-v+time;
}
}
if(k[i]==3)
{
v=(r+g-t[i]+time)%sum;
if(v>=0&&v<r)
{
time=r-v+time;
}
if(v>=(r+g)&&v<(r+y+g))
{
time=r+sum-v+time;
}
}
}
cout<<time;
}