CCF CSP 小明放学
一、題目
試題編號: 201812-2
試題名稱: 小明放學(xué)
時間限制: 1.0s
內(nèi)存限制: 512.0MB
問題描述:
題目背景
漢東省政法大學(xué)附屬中學(xué)所在的光明區(qū)最近實施了名為“智慧光明”的智慧城市項目。具體到交通領(lǐng)域,通過“智慧光明”終端,可以看到光明區(qū)所有紅綠燈此時此刻的狀態(tài)。小明的學(xué)校也安裝了“智慧光明”終端,小明想利用這個終端給出的信息,估算自己放學(xué)回到家的時間。
問題描述
一次放學(xué)的時候,小明已經(jīng)規(guī)劃好了自己回家的路線,并且能夠預(yù)測經(jīng)過各個路段的時間。同時,小明通過學(xué)校里安裝的“智慧光明”終端,看到了出發(fā)時刻路上經(jīng)過的所有紅綠燈的指示狀態(tài)。請幫忙計算小明此次回家所需要的時間。
輸入格式
輸入的第一行包含空格分隔的三個正整數(shù) r、y、g,表示紅綠燈的設(shè)置。這三個數(shù)均不超過 106。
輸入的第二行包含一個正整數(shù) n,表示小明總共經(jīng)過的道路段數(shù)和路過的紅綠燈數(shù)目。
接下來的 n 行,每行包含空格分隔的兩個整數(shù) k、t。k=0 表示經(jīng)過了一段道路,將會耗時 t 秒,此處 t 不超過 106;k=1、2、3 時,分別表示出發(fā)時刻,此處的紅綠燈狀態(tài)是紅燈、黃燈、綠燈,且倒計時顯示牌上顯示的數(shù)字是 t,此處 t 分別不會超過 r、y、g。
輸出格式
輸出一個數(shù)字,表示此次小明放學(xué)回家所用的時間。
樣例輸入
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
樣例輸出
46
樣例說明
小明先經(jīng)過第一段路,用時 10 秒。第一盞紅綠燈出發(fā)時是紅燈,還剩 5 秒;小明到達(dá)路口時,這個紅綠燈已經(jīng)變?yōu)榫G燈,不用等待直接通過。接下來經(jīng)過第二段路,用時 11 秒。第二盞紅綠燈出發(fā)時是黃燈,還剩兩秒;小明到達(dá)路口時,這個紅綠燈已經(jīng)變?yōu)榧t燈,還剩 11 秒。接下來經(jīng)過第三、第四段路,用時 9 秒。第三盞紅綠燈出發(fā)時是綠燈,還剩 10 秒;小明到達(dá)路口時,這個紅綠燈已經(jīng)變?yōu)榧t燈,還剩兩秒。接下來經(jīng)過最后一段路,用時 3 秒。共計 10+11+11+9+2+3 = 46 秒。
評測用例規(guī)模與約定
有些測試點具有特殊的性質(zhì):
* 前 2 個測試點中不存在任何信號燈。
測試點的輸入數(shù)據(jù)規(guī)模:
* 前 6 個測試點保證 n ≤ 103。
* 所有測試點保證 n ≤ 105。
二、分析
首先,此題目有一個問題,就是沒有說明每一個信號燈的時間范圍。我們按照此次考試第一題中的左閉右開區(qū)間進(jìn)行計算。
觀察題目注意到,此題目中給出的是小明出發(fā)時信號燈剩余的時間,而不是到達(dá)路口時信號燈剩余的時間。
我們將紅綠燈經(jīng)過紅綠黃又回到原點稱作一輪。需要注意到,小明每到一個路口,信號燈可能已經(jīng)變了好幾輪。因此,關(guān)鍵就是把變了好幾輪這個時間給去掉,因為他們并沒有作用,在小明到達(dá)路口之前,我們并不用管信號燈經(jīng)過了幾輪。
設(shè)小明在到路口時經(jīng)過的時間是sum,我們用取余的方法,即sum%(紅+綠+黃),得到的余數(shù),才是要考慮的。我們將得到的余數(shù)記為sum1,sum1就是小明在到達(dá)路口前經(jīng)過的不足一輪的時間。
最后我們只需要比較sum1和信號燈時間的關(guān)系,就可以確定用時了。具體見代碼。
三、注意
以k==2為例。首先要注意的就是,當(dāng)sum1 >= t+r+g && sum1 < r+g+y時,一定不要忘了sum += r+g+y+t-sum1+r里這個t,大家可以自己想一下試試。
另外就是,sum一定要定義為longlong類型,因為可以算一下,如果定義為int,顯然有可能會超出內(nèi)存要求的。(在dev c++里int和long都是四字節(jié),都會造成空間不足)
四、代碼
#include <iostream> using namespace std;int r, y, g; int n; int k; int t; long long sum = 0; int sum1 = 0;int main(){cin >> r >> y >> g;cin >> n;while(n){cin >> k >> t;if(k == 0){sum += t;}else if(k == 1){sum1 = sum % (r+g+y);if(sum1 < t){sum += t - sum1;}else if(sum1 >= t && (sum1 < t+g)){;}else if(sum1 >= t+g && sum1 < t+g+y){sum += t+g+y-sum1+r;}else if(sum1 >= t+g+y && sum1 < r+g+y){sum += r+g+y+t-sum1;}}else if(k == 2){sum1 = sum % (r+g+y);if(sum1 < t){sum += t-sum1+r;}else if(sum1 >= t && sum1 < t+r){sum += t+r-sum1;}else if(sum1 >= t+r && sum1 < t+r+g){;}else if(sum1 >= t+r+g && sum1 < r+g+y){sum += r+g+y+t-sum1+r;}}else if(k == 3){sum1 = sum % (r+g+y);if(sum1 < t){;}else if(sum1 >= t && sum1 < t+y){sum += t+y-sum1+r;}else if(sum1 >= t+y && sum1 < t+r+y){sum += t+r+y-sum1;}else if(sum1 >= t+r+y && sum1 < r+g+y){;}}n--;}cout << sum;return 0; }總結(jié)
以上是生活随笔為你收集整理的CCF CSP 小明放学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度云主机BCC挂载云盘CDS
- 下一篇: woff字体图元结构剖析,自定义字体的制