ccf-csp #201812-2 小明放学 (100分 附解析)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                ccf-csp #201812-2 小明放学 (100分 附解析)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                2021.11.26更新,第17行代碼判斷條件修正
 2019.12.14更新,坑點加一(最終答案需要用long long存儲)
題目鏈接:http://118.190.20.162/view.page?gpid=T81
題目分析
- 算是一道模擬題吧,題目的核心在于求遇到交通的時刻,交通燈處于什么樣的狀態,以及根據交通燈的狀態得出需要等待的時間。遇到這類問題,推薦在草稿紙上畫圖,理清楚思路再碼。
 - 我們需要明確,交通燈的狀態是循環的,而循環的周期就是(r+y+g)(r+y+g)(r+y+g),所以求解時可以將經過的時間段對周期取模。
 - 根據交通燈的變化的時間將分成區間[0,t),[t,t+g),[t+g,t+g+y),[t+g+y,g+y+r)[0,t),[t,t+g),[t+g,t+g+y),[t+g+y,g+y+r)[0,t),[t,t+g),[t+g,t+g+y),[t+g+y,g+y+r),看取余得到的時間落在哪個區間就可以知道交通燈狀態了。(注意不要忽略第四個區間)
 
坑點:
 題目沒寫明什么時候該走什么時候該等(吐槽 )
以及最終的答案需要用long long存儲(看題目數據范圍的時候,就應該提前分析好用什么類型存儲了)
代碼如下
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn = 1e5 + 10; int r, y, g, n, k, t; long long ans; int getTime(int type, int t, int total) {//根據交通燈的初始狀態進行分類討論if (type == 1) {t = total - t;//根據最后時間段落在哪個區間進行分類討論if (t < 0) return -t; //最終為紅燈else if (t < g) return 0; //最終為綠燈else return t < (g + y) ? (y - (t - g)) + r : (r + g + y - t); //最終為黃燈或紅燈} else if (type == 2) {t = total - t;if (t < 0) return r - t;else if (t < r) return r - t;else return t < (r + g) ? 0 : (r + g + y - t) + r;} else if (type == 3) {t = total - t;if (t < 0) return 0;else if (t < y) return y - t + r;else return t < (y + r) ? r - (t - y) : 0;} else {return t;} }int main() { // freopen("1.in", "r" ,stdin);scanf("%d%d%d", &r, &y, &g);scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d%d", &k, &t);ans += getTime(k, t, ans % (r + y + g));}printf("%lld\n", ans);return 0; }最后再附上一組幫我找到bug的數據:
input: 30 3 30 8 0 50 1 20 0 11 2 2 0 50 0 25 3 10 0 3outpu: 173總結
以上是生活随笔為你收集整理的ccf-csp #201812-2 小明放学 (100分 附解析)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: ccf-csp #201909-1 小明
 - 下一篇: 解决Java Web项目无法读取配置文件