天天看點

CCF:201812-1-小明上學(C++)

要求

時間限制: 1.0s

記憶體限制: 512.0MB

問題描述:

題目背景

  小明是漢東省政法大學附屬中學的一名學生,他每天都要騎自行車往返于家和學校。為了能盡可能充足地睡眠,他希望能夠預計自己上學所需要的時間。他上學需要經過數段道路,相鄰兩段道路之間設有至多一盞紅綠燈。

  京州市的紅綠燈是這樣工作的:每盞紅綠燈有紅、黃、綠三盞燈和一個能夠顯示倒計時的顯示牌。假設紅綠燈被設定為紅燈 r 秒,黃燈 y 秒,綠燈 g 秒,那麼從 0 時刻起,[0,r) 秒内亮紅燈,車輛不許通過;[r, r+g) 秒内亮綠燈,車輛允許通過;[r+g, r+g+y) 秒内亮黃燈,車輛不許通過,然後依次循環。倒計時的顯示牌上顯示的數字 l(l > 0)是指距離下一次信号燈變化的秒數。

問題描述

  一次上學的路上,小明記錄下了經過每段路的時間,和各個紅綠燈在小明到達路口時的顔色和倒計時秒數。希望你幫忙計算此次小明上學所用的時間。

輸入格式

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

  輸入的第二行包含一個正整數 n(n ≤ 100),表示小明總共經過的道路段數和看到的紅綠燈數目。

  接下來的 n 行,每行包含空格分隔的兩個整數 k、t。k=0 表示經過了一段道路,耗時 t 秒,此處 t 不超過 106;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

樣例輸出

70

樣例說明

  小明先經過第一段道路,用時 10 秒,然後等待 5 秒的紅燈,再經過第二段道路,用時 11 秒,然後等待 2 秒的黃燈和 30 秒的紅燈,再經過第三段、第四段道路,分别用時6、3秒,然後通過綠燈,再經過最後一段道路,用時 3 秒。共計 10 + 5 + 11 + 2 + 30 + 6 + 3 + 3=70 秒。

評測用例規模與約定

  測試點 1, 2 中不存在任何信号燈。

  測試點 3, 4 中所有的信号燈在被觀察時均為綠燈。

  測試點 5, 6 中所有的信号燈在被觀察時均為紅燈。

  測試點 7, 8 中所有的信号燈在被觀察時均為黃燈。

  測試點 9, 10 中将出現各種可能的情況。

代碼

#include<iostream>
using namespace std;
int main()
{
	int r,y,g;
	cin>>r>>y>>g;
	int n;
	cin>>n;
	int k,t;
	int sum=0,wait;
	for(int i=0;i<n;i++)
	{
		cin>>k>>t;
		if(k==0) sum+=t;//沒有信号燈,直接計算花在路上的時間 
		if(k==1) sum+=t;//有信号燈,計算等未完的紅燈的時間
		if(k==2)//有信号燈,計算等未完的黃燈+未開始的紅燈的時間
		{
			wait=t+r;
			sum+=wait;
		} 
		if(k==3) sum+=0; //有信号燈,但不需要計算綠燈時間 
	}
	cout<<sum;
	return 0; 
 } 
           

結果

CCF:201812-1-小明上學(C++)

繼續閱讀