參考文章 原博主的解法很妙!
演算法設計
本題中紅綠燈的變換順序為
可以定義乙個長度為3的陣列light來儲存紅燈、綠燈、黃燈時長,令sum為紅綠黃燈的總時長。注意由於k=1、2、3 時,分別表示出發時刻,紅綠燈狀態是紅燈、黃燈、綠燈,需要當k == 1時,令k=0;當k==3時,令k=2,才能建立起k和陣列light的對映關係。
關鍵是計算出小明到達某乙個紅綠燈時亮的是那種燈,以及該燈還能亮多長時間。假設初始時刻某乙個紅綠燈還能亮的時間為b,且該燈在陣列light中的下標為a,那麼該燈已經點亮的時間為light[a]-b。假設小明到達該燈時已經用時ans,那麼到達該燈時,如果不變燈,該燈已經點亮時間為light[a]-b+ans。sum為紅綠黃燈從紅到綠再變黃最後轉化到紅燈,即紅綠燈變換一圈的總時長,那麼(light[a]-b+ans)%sum就表示該紅綠燈變換的最後一周的時長。不妨令b=(light[a]-b+ans)%sum,若b比當前紅綠燈時長長,就讓b減去當前的紅綠燈時長,並令a轉向下乙個紅綠燈,如此反覆,直到b比當前紅綠燈時長短,那麼當前的a就指向小明到達某乙個紅綠燈時亮的燈,b表示該燈已經點亮的時間。
注意點
要用long long儲存資料,int儲存會造成資料溢位
**實現
#include
typedef
long
long ll;
using
namespace std;
ll n;
ll light[3]
;// 紅、綠、黃
ll k,t;
// 燈; 顯示的數字
ll ans;
intmain()
else
if(k==0)
// 紅燈
ans +
= light[k]
-t;// 加上紅燈剩餘時長
else
if(k==2)
// 黃燈
ans +
= light[k]
-t+light[0]
;// 加上黃燈和紅燈 }}
cout<
return0;
}
ccf認證 201812 2 小明放學
題目 題目背景 漢東省政法大學附屬中學所在的光明區最近實施了名為 智慧型光明 的智慧型城市專案。具體到交通領域,通過 智慧型光明 終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了 智慧型光明 終端,小明想利用這個終端給出的資訊,估算自己放學回到家的時間。問題描述 一次放學的時候,小明...
CCF認證 201812 2小明放學
題目背景 漢東省政法大學附屬中學所在的光明區最近實施了名為 智慧型光明 的智慧型城市專案。具體到交通領域,通過 智慧型光明 終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了 智慧型光明 終端,小明想利用這個終端給出的資訊,估算自己放學回到家的時間。問題描述 一次放學的時候,小明已經規...
CCF認證自測 201812 2小明放學
試題編號 201812 2 試題名稱 小明放學 時間限制 1.0s 記憶體限制 512.0mb 問題描述 題目背景 漢東省政法大學附屬中學所在的光明區最近實施了名為 智慧型光明 的智慧型城市專案。具體到交通領域,通過 智慧型光明 終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了 智慧...