ゆるふわ競プロ

Javaでゆるゆる競プロしています.忘れっぽいのでメモ用,復習用

ABC080 D

問題

  • 問題を理解するのは容易な問題である
  • 細かい設定もないため実装するだけなのだが、実装方法が少々難しかった。
  • 一定期間使っている録画機の最大数を求める問題である。
  • この問題は105という制約がついているので簡単になっている。
  • そう全探索すれば良いのだ
  • それはわかっていても実装が楽になるわけではなかった。

参考解答

  • 非常に簡潔で読みやすいコードを見つけた
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int C = sc.nextInt();
// チャンネルの数と時間の二次元配列を用意する
        int[][] a = new int[C][100000];
        for (int i = 0; i < N; ++i) {
            int s = sc.nextInt() - 1;
            int t = sc.nextInt() - 1;
            int c = sc.nextInt() - 1;
// 対象チャンネルの見る時間の数字を+1して見る時間をON状態にする
// <= にしているとこれが重要
            for (int j = s; j <= t; ++j)
                if (a[c][j] == 0)
                    a[c][j]++;
        }
 // それぞれの時間について起動中の最大数を求める。
        int ans = 0;
        for (int i = 0; i < 100000; ++i) {
            int tmp = 0;
            for (int j = 0; j < C; ++j) {
                tmp += a[j][i];
            }
            ans = Math.max(ans, tmp);
        }
        System.out.println(ans);
    }
}

備考

  • startの場所に+1 finnishの場所に-1をつけて最大値maxを求めるたりかたもある。