結果

問題 No.120 傾向と対策:門松列(その1)
ユーザー htensaihtensai
提出日時 2020-05-07 18:34:50
言語 Java21
(openjdk 21)
結果
AC  
実行時間 662 ms / 5,000 ms
コード長 1,207 bytes
コンパイル時間 1,954 ms
コンパイル使用メモリ 79,100 KB
実行使用メモリ 59,740 KB
最終ジャッジ日時 2024-07-03 09:32:50
合計ジャッジ時間 5,344 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 644 ms
59,696 KB
testcase_01 AC 662 ms
59,544 KB
testcase_02 AC 450 ms
57,932 KB
testcase_03 AC 634 ms
59,740 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.*;

public class Main {
	public static void main (String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		StringBuilder sb = new StringBuilder();
		for (int j = 0; j < t; j++) {
    		int n = sc.nextInt();
    		HashMap<Integer, Integer> map = new HashMap<>();
    		for (int i = 0; i < n; i++) {
    		    int x = sc.nextInt();
    		    if (map.containsKey(x)) {
    		        map.put(x, map.get(x) + 1);
    		    } else {
    		        map.put(x, 1);
    		    }
    		}
    		int[] counts = new int[n + 1];
    		for (int x : map.values()) {
    		    counts[x]++;
    		}
    		int left = 0;
    		int right = n / 3 + 1;
    		while (right - left > 1) {
    		    int m = (left + right) / 2;
    		    if (check(m, counts)) {
    		        left = m;
    		    } else {
    		        right = m;
    		    }
    		}
    		sb.append(left).append("\n");
		}
    	System.out.print(sb);
	}
	
	static boolean check(int target, int[] counts) {
	    int count = 0;
	    for (int i = 1; i < counts.length; i++) {
	        count += Math.min(target, i) * counts[i];
	        if (count >= target * 3) {
	            return true;
	        }
	    }
	    return false;
	}
}
0