読者です 読者をやめる 読者になる 読者になる

ABC024_C問題

なんとか解けたので、久しぶりに更新。

AtCoder社のAtCoder Beginner Contest(ABC)のC問題。
http://abc024.contest.atcoder.jp/

良かった点
・2次元配列を使わなかったので計算量が指数爆発せずに済んだ。

悪かった点
・ホワイトボード上での机上設計では別の考えで実装しようと考え、
コーディング中に方針を転換したところ。

以下、メインの部分

	class MainClass
	{
		public static void Main (string[] args)
		{
			Scanner cin = new Scanner ();

			int N = cin.nextInt (); //街の数
			int D = cin.nextInt (); //移動にかかる日数
			int K = cin.nextInt (); //民族の個数
			int[] L = new int[D];
			int[] R = new int[D];
			for (int i = 0; i < D; i++) {
				L[i] = cin.nextInt (); //制約L
				R[i] = cin.nextInt (); //制約R
			}
			int[] S = new int[K]; //最初の街
			int[] T = new int[K]; //目的の街

			int[] ans = new int[K];
			for (int i = 0; i < K; i++) {
				S[i] = cin.nextInt ();
				T[i] = cin.nextInt ();
			}

			for (int i = 0; i < K; i++) { //移民の数
				int min = S [i];
				int max = S [i];

				for (int k = 0; k < D; k++) {
					if ((R [k] < min) || (L [k] > max)) { //今までの渡航可能場所と被っていない場合
						;
					} else {
						min = Math.Min (min, L [k]);
						max = Math.Max (max, R [k]);

						if (min <= T [i] && max >= T [i]) {
							ans [i] = k + 1; //0日目から開始しているため+1
							break;
						}
					}
				}
			}
			for (int i = 0; i < K; i++) {
				Console.WriteLine (ans [i]);
			}
		}
	}

久しぶりにすっきりした回答ができた。

追記:解説を見ていたら進める場合はできるだけ近づく(貪欲法)で良かったらしい。。。
さらに追記:自分の方法はRangeと呼ばれるらしい。

広告を非表示にする