はじめに
自分用の備忘録。
ポイント
部分に分解して、答えへの寄与度を求める。イメージは、モテる男性の特徴を知性、ユーモア、外見、年収に分解して、モテに対してどれくらいモテに重要なのかを求めるのと近いね。
問題
A37 - Travel 2 , https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_ak
ALGO 市には N 個の駅と M 個のバス停があり、下図のように道路で結ばれています。 すべての組 (i,j) に対して「駅 i からバス停 j までの所要時間」を足した値はいくつですか?
解答例
import java.util.*; class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 入力 int N = sc.nextInt(); int M = sc.nextInt(); long B = sc.nextLong(); long[] A = new long[N + 1]; long[] C = new long[M + 1]; for (int i = 1; i <= N; i++) A[i] = sc.nextLong(); for (int j = 1; j <= M; j++) C[j] = sc.nextLong(); // 答えの計算 long Answer = 0; for (int i = 1; i <= N; i++) Answer += A[i] * M; Answer += B * N * M; for (int j = 1; j <= M; j++) Answer += C[j] * N; // 出力 System.out.println(Answer); } };
自分が書いた間違えたコード
マジでどこが間違っているかわからん。将来の私よ、頼んだ。
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // インプットを格納していきまーす。 int N = sc.nextInt(); int M = sc.nextInt(); int B = sc.nextInt(); int[] A = new int[N]; int[] C = new int[M]; // ここ少し忘れていて、ぜんぜん応え合わないじゃん、ってなって焦った。 for (int i = 0; i < A.length; i++) { A[i] = sc.nextInt(); } for (int i = 0; i < C.length; i++) { C[i] = sc.nextInt(); } // トリマBの時間を求めるで。 /* BはNとMの組み合わせ分あるから、次の式で求める。 * 理由:どこから出発しようとも絶対に通るからね。 */ int BTime = B * N * M; // Aの時間、(図で言うなら左)の時間を求めるで。 /* 左の時間全部足して、右の数かけてやる感じ。 * 中学校で学んだ分配法則使うで。 */ int ATime = 0; for (int i = 0; i < N; i++) { ATime += A[i]; } // System.out.println(ATime); // 上記のコメントは、「え?答え合わないじゃん、どこ間違ってるの?」って軽くデバックした時の名残 ATime = ATime * M; int CTime = 0; for (int i = 0; i < M; i++) { CTime += C[i]; } // System.out.println(CTime); // 上に同じ。 CTime = CTime * N; // じゃあ、全部足して、出力するで。 System.out.println(ATime + BTime + CTime); // ほな、さいなら sc.close(); } }