输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 10^6。 输入的第二行包含一个正整数 n,表示小明总共经过的道路段数和路过的红绿灯数目。 接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,将会耗时 t 秒,此处 t 不超过 10^6;k=1、2、3 时,分别表示出发时刻,此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
voidcalcState(timeDuration time, int& k, timeDuration& t){ const timeDuration cycle = stageTime[0] + stageTime[1] + stageTime[2]; time %= cycle; if (time < t) { t -= time; return; } time -= t; nextState(k); // frist part stage bool proceed = true; timeDuration stageTime; while (time > 0) { stageTime = getStageTime(k); if (time < stageTime) { t = stageTime - time; // final part stage break; } time -= stageTime; nextState(k); // proceed entire stage } return; }
intmain() { int &r = stageTime[0], &y = stageTime[1], &g= stageTime[2]; cin >> r >> y >> g; timeDuration n; cin >> n; timeDuration ans = 0; for (timeDuration i = 0; i < n; i++) { // clog << "当前时间点:" << ans << endl; int k; timeDuration t; cin >> k >> t; if (k == 0) { ans += t; continue; } // clog << "初始状态:" << k << " " << t << endl; calcState(ans, k, t); // clog << "达到状态:" << k << " " << t << endl; switch (k) { case1: // R ans += t; break; case2: // Y ans += t + r; break; case3: // G ans += 0; break; default: break; } } cout << ans << endl; return0; }
Donate
Copyright:
Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.