はじめに
この問題のポイント
- 愚直にやると、メモリの制限と制限時間に間に合わなくなるかも。
- 配列を用意する時にもメモリの要領を確保しないといけないからね。小さいなら問題ないけど、大きいならちょっと。キャリーケースに分厚いニットを入れるとほかの者がいれられないのに似ている。
- だから、連想配列を使うよ。
- 最小値の最大化は二分探索を使うらしい。
- 解法が分かっていただけに悔しかった問題。でも実装できないんですよねー。
- これをきっかけに連想配列の使い方をマスターしよう!
目次
問題と解説
問題 atcoder.jp
解説 atcoder.jp
YouTube youtu.be
解答例
公式の解答を私なりに、Javaに変換
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] a = new int[N]; int[] c = new int[N]; Map<Integer, Integer> mininumTaste = new HashMap<Integer, Integer>(); for (int i = 0; i < N; i++) { a[i] = sc.nextInt(); c[i] = sc.nextInt(); } for (int i = 0; i < N; i++) { if (mininumTaste.containsKey(c[i])) { mininumTaste.put(c[i], Math.min(mininumTaste.get(c[i]), a[i])); } else { mininumTaste.put(c[i], a[i]); } } int ans = -1; for (int i : mininumTaste.keySet()) { ans = Math.max(ans, mininumTaste.get(i)); } System.out.println(ans); sc.close(); } }
ほかの解答例
なるほど、解法の部分をsolve()としてmain()の外に出しているのですね。参考になります。
import java.util.*; import java.io.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] a = new int[n]; int[] c = new int[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); c[i] = sc.nextInt(); } System.out.println(solve(n, a, c)); } static String solve(int n, int[] a, int[] c) { HashMap<Integer, Integer> cmin = new HashMap<>(); for(int i=0; i<n; i++) { cmin.put(c[i], Math.min(a[i], cmin.getOrDefault(c[i], Integer.MAX_VALUE))); } int result = 0; for(Integer ai: cmin.values()) { result = Math.max(result, ai); } return String.valueOf(result).trim(); } }
所感
ほかの人のコードを見るの面白いですね! なんか、こう、めちゃくちゃ長いのから、普通にきれいなものまでたくさんありますね。あと、テクニック満載なものもあって、見ていて面白い。