私へようこそCCF認定解決ディレクトリ
タイトル説明
思考プロセス
- 条件はライトの暁明出発の対象となっているとき、私たちは計算を自分で到着時に各ランプのための状態に持っています。
- 累積時間データに新しい変数の合計は、int型の極端なケースのため、長すぎるの使用をオーバーフローします。
- 新しい変数xを作成し、店舗のトラフィックに必要な時間は、ラウンド点灯します。
- 道路は、+ =時間直和であれば、データを読み始めます。
- 理解しやすい表示次の図に、このステップ。そうでなければ、我々はあなたができる、そしてxの合計を追加し、引き継ぐ(心がトラフィックのサイクルタイムラインを点灯し、緑色の光、終わりのための赤色光、無限ループで始まるがあります)、このラウンドの残り時間を計算する方法、最終的な判断、そうでない場合は、この時点で、緑色光、プラスに必要な時間を経過した今回ラウンドを取得します。
- 参照、歓迎のコメントを理解していない場合、我々はすぐに返信されます。
コード
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int r = in.nextInt(), y = in.nextInt(), g = in.nextInt(), n = in.nextInt();//分别对应三个灯的时长
int x = r+y+g;//三个灯的总时长
long sum = 0;//经过的时间,可能会超出int的存储范围
for ( int i = 0; i < n; i++ ) {
int type = in.nextInt(), time = in.nextInt();//灯的类型和倒计时
long temp = 0;
if ( type == 0 ) {//如果是路时,则直接加
sum += time;
} else {
switch ( type ) {
case 1: temp = (sum+x-time)%x; break;//红灯
case 2: temp = (sum+y+g-time)%x; break;//黄灯
case 3: temp = (sum+g-time)%x; break;//绿灯
}
if ( temp > g ) sum = sum+x-temp;//如果此时不是绿灯
}
}
System.out.println(sum);
}
}