結果
| 問題 | No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう! |
| コンテスト | |
| ユーザー |
EvbCFfp1XB
|
| 提出日時 | 2025-12-28 18:16:36 |
| 言語 | Java (openjdk 25.0.1) |
| 結果 |
AC
|
| 実行時間 | 2,578 ms / 5,000 ms |
| コード長 | 9,245 bytes |
| 記録 | |
| コンパイル時間 | 2,732 ms |
| コンパイル使用メモリ | 82,384 KB |
| 実行使用メモリ | 87,540 KB |
| スコア | 9,853,536 |
| 平均クエリ数 | 1464.64 |
| 最終ジャッジ日時 | 2025-12-28 18:20:38 |
| 合計ジャッジ時間 | 232,865 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
private static int[] h = new int[30];
private static int[] b = new int[30];
public static void main(String[] args) {
try {
solve();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void solve() {
try (Scanner in = new Scanner(System.in)) {
ArrayList<String> candidiates = generateCandidates();
String q = candidiates.remove(candidiates.size() - 1);
for (;;) {
System.out.println(q);
System.out.flush();
updateHB(in);
if (h[0] == 5 && b[0] == 0) {
break;
}
if (h[0] == -1 && b[0] == -1) {
break;
}
int maxHB = maxHB();
if (maxHB == 505 || maxHB == 514 || maxHB == 523 || maxHB == 532 || maxHB == 541) {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
if (hb(candidiate, q) == maxHB) {
q = candidiate;
remove(candidiates, i);
break;
}
}
} else {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
int hb = hb(candidiate, q);
if (hb == 505 || hb == 514 || hb == 523 || hb == 532 || hb == 541) {
remove(candidiates, i);
}
}
if (maxHB == 404 || maxHB == 413 || maxHB == 422 || maxHB == 431 || maxHB == 440) {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
if (hb(candidiate, q) == maxHB) {
q = candidiate;
remove(candidiates, i);
break;
}
}
} else {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
int hb = hb(candidiate, q);
if (hb == 404 || hb == 413 || hb == 422 || hb == 431 || hb == 440) {
remove(candidiates, i);
}
}
if (maxHB == 303 || maxHB == 312 || maxHB == 321 || maxHB == 330) {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
if (hb(candidiate, q) == maxHB) {
q = candidiate;
remove(candidiates, i);
break;
}
}
} else {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
int hb = hb(candidiate, q);
if (hb == 303 || hb == 312 || hb == 321 || hb == 330) {
remove(candidiates, i);
}
}
if (maxHB == 202 || maxHB == 211 || maxHB == 220) {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
if (hb(candidiate, q) == maxHB) {
q = candidiate;
remove(candidiates, i);
break;
}
}
} else {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
int hb = hb(candidiate, q);
if (hb == 202 || hb == 211 || hb == 220) {
remove(candidiates, i);
}
}
if (maxHB == 101 || maxHB == 110) {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
if (hb(candidiate, q) == maxHB) {
q = candidiate;
remove(candidiates, i);
break;
}
}
} else {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
int hb = hb(candidiate, q);
if (hb == 101 || hb == 110) {
remove(candidiates, i);
}
}
if (maxHB == 0) {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
if (hb(candidiate, q) == maxHB) {
q = candidiate;
remove(candidiates, i);
break;
}
}
} else {
for (int i = candidiates.size() - 1; i >= 0; i--) {
String candidiate = candidiates.get(i);
int hb = hb(candidiate, q);
if (hb == 0) {
remove(candidiates, i);
}
}
q = candidiates.remove(candidiates.size() - 1);
}
}
}
}
}
}
}
}
}
private static void remove(ArrayList<String> candidiates, int i) {
Collections.swap(candidiates, i, candidiates.size() - 1);
candidiates.remove(candidiates.size() - 1);
}
private static void updateHB(Scanner in) {
for (int i = 0; i < h.length; i++) {
h[i] = in.nextInt();
b[i] = in.nextInt();
}
}
private static ArrayList<String> generateCandidates() {
ArrayList<String> candidiates = new ArrayList<>();
for (int i = 0; i <= 99999; i++) {
StringBuilder sb = new StringBuilder();
int v = i;
for (int j = 0; j < 5; j++) {
sb.append(v % 10);
v /= 10;
}
if (valid(sb)) {
candidiates.add(sb.toString());
}
}
Collections.shuffle(candidiates);
return candidiates;
}
private static int hb(String s, String t) {
int h = 0;
int b = 0;
for (int i = 0; i < 5; i++) {
if (s.charAt(i) == t.charAt(i)) {
h++;
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j == i) {
continue;
}
if (s.charAt(i) == t.charAt(j)) {
b++;
}
}
}
return 100 * (h + b) + 10 * h + b;
}
private static int maxHB() {
int max = 0;
for (int i = 0; i < h.length; i++) {
int hb = 100 * (h[i] + b[i]) + 10 * h[i] + b[i];
if (hb != 550) {
max = Math.max(max, hb);
}
}
return max;
}
private static boolean valid(StringBuilder sb) {
for (int i = 0; i < sb.length(); i++) {
for (int j = i + 1; j < sb.length(); j++) {
if (sb.charAt(j) == sb.charAt(i)) {
return false;
}
}
}
return true;
}
}
EvbCFfp1XB