CCF認證 201812 2 小明放學

2021-10-22 17:37:21 字數 1213 閱讀 2368

參考文章 原博主的解法很妙!

演算法設計

本題中紅綠燈的變換順序為

可以定義乙個長度為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 問題描述 題目背景 漢東省政法大學附屬中學所在的光明區最近實施了名為 智慧型光明 的智慧型城市專案。具體到交通領域,通過 智慧型光明 終端,可以看到光明區所有紅綠燈此時此刻的狀態。小明的學校也安裝了 智慧...