ccf 201812-2 小明放學 C++ 60分問題 AC代碼

目錄

解決方案:

出現問題:

題目描述:

AC代碼


解決方案:

1、首先明白題意:紅綠燈的顯示情況是從第一個數據時間算起的。所以每到一個燈的時候就要判斷一下這個燈在我們前面花費的時間裏經過的狀況。

2、紅綠燈的規則:紅燈停(等到綠燈時刻同行),綠燈行,黃燈等一等(等過黃燈到紅燈再到綠燈才能走)。

3、實現:

(1)每個紅綠燈都有一個循環週期爲(r+g+y).所以我們算燈當前的狀態只需要對當前所有的花費%(r+g+y就能得到當前一輪的紅綠燈用了多久的時間。

(2)對每種紅綠黃燈的等待情況進行分析——分析之前花費的時間到達當前紅綠燈路口時,紅綠燈的狀態。我主要是計算(所有的花費%(r+g+y)- t ) 的時間處於哪個燈的時間狀態。進行時間計算。

出現問題:

自己一開始一直60分,代碼思路一直沒有問題,主要就是因爲 花費的所有時間爆內存了,int存儲(long int)的數值大小是10的32次方,大小不滿足。用long long的形式存儲才能滿足題目要求,這裏注意如果是用c輸出 打印的時候是%lld。

題目描述:

試題編號: 201812-2
試題名稱: 小明放學
時間限制: 1.0s
內存限制: 512.0MB
問題描述:

題目背景

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

問題描述

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

輸入格式

  輸入的第一行包含空格分隔的三個正整數 r、y、g,表示紅綠燈的設置。這三個數均不超過 106。
  輸入的第二行包含一個正整數 n,表示小明總共經過的道路段數和路過的紅綠燈數目。
  接下來的 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

樣例輸出

46

樣例說明

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

評測用例規模與約定

  有些測試點具有特殊的性質:
  * 前 2 個測試點中不存在任何信號燈。
  測試點的輸入數據規模:
  * 前 6 個測試點保證 n ≤ 103。
  * 所有測試點保證 n ≤ 105。

AC代碼

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int r,y,g;
	int n;
	int k,t;
	long long sum=0;
	int temp=0;;
	int allLight=0;
	
	scanf("%d%d%d",&r,&y,&g);
	scanf("%d",&n);

	allLight=r+y+g;
	
	for(int i=0;i<n;i++)
	{
		cin>>k>>t;
		if(k==0)//走路的時間 
		{
			sum+=t; 			 
		}
		if(k==1) //紅燈 
		{
			temp=sum%allLight;
			
			if(temp<t)//還在紅燈範圍內,等待綠燈 
			{
				sum+=t-temp;			
			}
			else if(temp-t<g)  //在綠燈階段,直接通過
			{
				sum+=0; 
			}
			else if( temp-t-g<y) //在黃燈範圍內 +紅燈 
			{
				sum+=(y-(temp-g-t)+r);				
			}
			else//在紅燈範圍內 ,等待綠燈 
			{
				sum+=(r-(temp-g-y-t));			
			} 
		}
		if(k==2)//黃燈
		{
			temp=sum%allLight;
			if(temp<t)//在黃燈範圍內 ,需要加上紅燈的時間 
			{
				sum+=t-temp+r; 
			
			}
			else if(temp-t<r) //在紅燈範圍內,等待綠燈 
			{
				sum+=(r-(temp-t)) ;			
			} 
			else if((temp-r)-t<g)  //綠燈 
			{
				sum+=0;  
			}
			else //在黃燈範圍內 
			{
				sum+=(y-(temp-r-g-t)+r);				
			}
		}
		if(k==3)//綠燈
		{
			temp=sum%allLight;
			if(temp<t) //綠燈 
			{
				sum+=0; 
			}
			else if(temp-t<y) //在黃燈範圍內+紅燈 
			{
				sum+=(y-(temp -t)+r) ;			
			} 
			else if((temp-t-y)<r)  //紅燈 ,等待綠燈 
			{
				sum+=(r-((temp-t)-y)) ;			
			}
			else //綠燈行 
			{
				sum+=0; 
			}
		
		} 
		
	}
	printf("%lld",sum);
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章