結果
問題 | No.568 じゃんじゃん 落とす 委員会 |
ユーザー | k_6101 |
提出日時 | 2019-12-21 13:13:42 |
言語 | Java21 (openjdk 21) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 5,456 bytes |
コンパイル時間 | 2,199 ms |
コンパイル使用メモリ | 94,376 KB |
実行使用メモリ | 95,592 KB |
最終ジャッジ日時 | 2024-07-19 07:20:07 |
合計ジャッジ時間 | 20,684 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | TLE | - |
testcase_01 | TLE | - |
testcase_02 | AC | 195 ms
46,940 KB |
testcase_03 | AC | 196 ms
46,988 KB |
testcase_04 | AC | 202 ms
46,284 KB |
testcase_05 | AC | 186 ms
46,704 KB |
testcase_06 | AC | 193 ms
46,820 KB |
testcase_07 | AC | 192 ms
46,572 KB |
testcase_08 | AC | 174 ms
46,140 KB |
testcase_09 | AC | 190 ms
46,220 KB |
testcase_10 | AC | 188 ms
46,608 KB |
testcase_11 | AC | 201 ms
46,888 KB |
testcase_12 | TLE | - |
testcase_13 | TLE | - |
testcase_14 | TLE | - |
testcase_15 | TLE | - |
testcase_16 | TLE | - |
testcase_17 | TLE | - |
testcase_18 | AC | 917 ms
82,964 KB |
testcase_19 | TLE | - |
testcase_20 | AC | 977 ms
83,808 KB |
testcase_21 | TLE | - |
testcase_22 | AC | 984 ms
83,864 KB |
testcase_23 | AC | 204 ms
47,000 KB |
testcase_24 | AC | 185 ms
45,560 KB |
testcase_25 | AC | 188 ms
45,912 KB |
ソースコード
import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.Array; import java.math.BigDecimal; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; import java.util.Set; import java.util.Stack; import java.util.TreeMap; import java.util.TreeSet; import static java.util.Comparator.*; public class Main { public static void main(String[] args) { PrintWriter out = new PrintWriter(System.out); Solver solver = new Solver(System.in, out); solver.solve(); out.close(); } } class Solver { Scanner sc; PrintWriter out; public Solver(InputStream in, PrintWriter out) { sc = new Scanner(in); this.out = out; } // ================================================================== int[] cnt = new int[10]; // [正解数] = 人数 MapList A = new MapList(); // Aの点数 → インデックスのリスト MapList B = new MapList(); // Bの点数 → インデックスのリスト int[] X = new int[100010]; // [インデックス] = その人の点数 public void solve() { int N = Integer.parseInt(sc.next()); int M = Integer.parseInt(sc.next()); int a, b; List<Integer> list; for (int i = 0; i < N; i++) { X[i] = Integer.parseInt(sc.next()) + 1; // 初期値は a は必ず正解とする cnt[X[i]]++; a = Integer.parseInt(sc.next()); b = Integer.parseInt(sc.next()); A.add(a, i); B.add(b, i); } // A.dump(); // B.dump(); // for (int i = 0; i < 10; i++) { // out.println("cnt[" + i + "] = " + cnt[i]); // } int ans = 999999999; int sb = 100001; LOOP: for (int sa = 0; sa <= 100001; ) { while(cnt[2] + cnt[3] + cnt[4] + cnt[5] < M) { sb--; if(sb < 0) break LOOP; if(B.contains(sb)) { // out.println(" 1 SA = " + sa + " SB = " + sb); for(Integer index : B.getList(sb)) { // 見つかった人はBを正解になる // out.println(" SB = " + sb + " が見つかった[" + index + "] 元の正解数 = " + X[index] // + " 元の人数 = " + cnt[X[index]] + " 先の人数 = " + cnt[X[index]+1]); cnt[X[index]]--; // 元の正解数のカウントを減らす X[index]++; // 正解数を更新する cnt[X[index]]++; // 新しい更新数のカウントを増やす } } } ans = Math.min(ans, cnt[3] + cnt[4] + cnt[5]); // 3問以上の最小人数を取得する if(A.contains(sa)) { // out.println(" 2 SA = " + sa + " SB = " + sb); for(Integer index : A.getList(sa)) { // 見つかった人はAを不正解になる // out.println(" SA = " + sa + " が見つかった[" + index + "] 元の正解数 = " + X[index] // + " 元の人数 = " + cnt[X[index]] + " 先の人数 = " + cnt[X[index]-1]); cnt[X[index]]--; // 元の正解数のカウントを減らす X[index]--; // 正解数を更新する cnt[X[index]]++; // 新しい更新数のカウントを増やす } } sa++; // SAを更新する } out.println(ans); } // -------------------------------------- // Integer のキーに対して、Integer のリストを管理する class MapList { private HashMap<Integer, List<Integer>> map; // 昇順のマップ public MapList() { map = new HashMap<>(); } // // reverse = tree なら降順のマップ // public MapList(boolean reverse) { // if(reverse) { // map = new TreeMap<Integer, List<Integer>>(Collections.reverseOrder()); // } else { // map = new TreeMap<>(); // } // } // 値の追加 public void add(Integer key, Integer val) { List<Integer> list = map.get(key); if(list == null) { list = new ArrayList<>(); map.put(key, list); } list.add(val); } // 値の削除 public void del(Integer key, Integer val) { List<Integer> list = map.get(key); if(list == null) return; list.remove(val); if(list.isEmpty()) map.remove(key); } // データが空か? public boolean isEmpty() { return map.isEmpty(); } // キーセットを返す public Set<Integer> keySet() { return map.keySet(); } // キーの要素があれば true を返す public boolean contains(Integer key) { if(map.get(key) == null) return false; else return true; } // リストの取得(なければ null を返す) public List<Integer> getList(Integer key) { return map.get(key); } // ダンプ public void dump() { List<Integer> list; out.println("------------ dump start -------------"); for(int key : map.keySet()){ list = map.get(key); out.println("key = " + key); for (int val : list) { out.print(" " + val); } out.println(""); } out.println("------------ dump end -------------"); } } }