結果
| 問題 |
No.5014 セクスタプル (reactive)
|
| コンテスト | |
| ユーザー |
ks2m
|
| 提出日時 | 2022-12-29 20:39:40 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 1,914 ms / 2,000 ms |
| コード長 | 4,806 bytes |
| コンパイル時間 | 2,180 ms |
| 実行使用メモリ | 75,624 KB |
| スコア | 457,852,361 |
| 平均クエリ数 | 35.00 |
| 最終ジャッジ日時 | 2022-12-29 20:43:08 |
| 合計ジャッジ時間 | 199,021 ms |
|
ジャッジサーバーID (参考情報) |
judge12 / judge11 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
static boolean debug = false;
static long startTime;
static int n = 6;
static int nn = 36;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// solveOpen(br);
solveReactive(br);
br.close();
}
static void solveOpen(BufferedReader br) throws Exception {
startTime = System.currentTimeMillis();
List<Obj> list = new ArrayList<>(nn);
for (int i = 0; i < nn; i++) {
String[] sa = br.readLine().split(" ");
Obj o = new Obj();
for (int j = 0; j < n; j++) {
o.d[j] = Integer.parseInt(sa[j]) - 1;
o.cnt[o.d[j]]++;
o.ex[o.d[j]] = true;
}
list.add(o);
}
f = new Obj[n][n];
for (int i = 0; i < nn; i++) {
int x = i / n;
int y = i % n;
f[x][y] = list.get(i);
}
solve1(new HashSet<>(), 1800);
for (Obj o : list) {
System.out.println(o.x + " " + o.y);
}
if (debug) {
System.out.println(newScore);
}
}
static void solveReactive(BufferedReader br) throws Exception {
f = new Obj[n][n];
for (int x = 0; x < n; x++) {
for (int y = 0; y < n; y++) {
Obj o = new Obj();
for (int j = 0; j < n; j++) {
o.d[j] = (int) (Math.random() * 6);
o.cnt[o.d[j]]++;
o.ex[o.d[j]] = true;
}
f[x][y] = o;
}
}
startTime = System.currentTimeMillis();
Set<Integer> fixed = new HashSet<>();
boolean[][] done = new boolean[n][n];
for (int t = 0; t < 35; t++) {
Obj o = new Obj();
label:
for (int x = 0; x < n; x++) {
for (int y = 0; y < n; y++) {
if (!done[x][y]) {
f[x][y] = o;
break label;
}
}
}
String[] sa = br.readLine().split(" ");
for (int j = 0; j < n; j++) {
o.d[j] = Integer.parseInt(sa[j]) - 1;
o.cnt[o.d[j]]++;
o.ex[o.d[j]] = true;
}
solve1(fixed, 52 * (t + 1));
System.out.println(o.x + " " + o.y);
int x = o.x - 1;
int y = o.y - 1;
fixed.add(x * n + y);
done[x][y]= true;
}
}
static void solve1(Set<Integer> fixed, long limitTime) {
int chgNum = Math.min(3, nn - fixed.size());
List<Integer> chgPos = new ArrayList<>(chgNum);
bestWk = new int[chgNum];
chgObj = new ArrayList<>(chgNum);
while (true) {
long time = System.currentTimeMillis() - startTime;
if (time > limitTime) {
break;
}
chgPos.clear();
chgObj.clear();
for (int i = 0; i < chgNum; i++) {
int p = rand36(fixed, chgPos);
chgPos.add(p);
chgObj.add(f[p / n][p % n]);
}
newScore = 0;
permutation(chgPos, 0, 0, new int[chgNum]);
for (int i = 0; i < chgNum; i++) {
int x = bestWk[i] / n;
int y = bestWk[i] % n;
f[x][y] = chgObj.get(i);
}
}
for (int x = 0; x < n; x++) {
for (int y = 0; y < n; y++) {
f[x][y].x = x + 1;
f[x][y].y = y + 1;
}
}
}
static int newScore;
static int[] bestWk;
static Obj[][] f;
static List<Obj> chgObj;
static void permutation(List<Integer> org, int used, int idx, int[] wk) {
if (idx == org.size()) {
for (int i = 0; i < idx; i++) {
int x = wk[i] / n;
int y = wk[i] % n;
f[x][y] = chgObj.get(i);
}
int res = score(f);
if (res >= newScore) {
newScore = res;
for (int i = 0; i < idx; i++) {
bestWk[i] = wk[i];
}
}
return;
}
for (int i = 0; i < org.size(); i++) {
if ((used >> i & 1) == 0) {
wk[idx] = org.get(i);
permutation(org, used | 1 << i, idx + 1, wk);
}
}
}
static int rand36(Set<Integer> ng, List<Integer> ng2) {
int rem = 36 - ng.size() - ng2.size();
int val = (int) (Math.random() * rem) + 1;
int cnt = 0;
for (int i = 0; i < 36; i++) {
if (!ng.contains(i) && !ng2.contains(i)) {
cnt++;
if (cnt == val) {
return i;
}
}
}
throw new RuntimeException();
}
static int score(Obj[][] f) {
int ret = 0;
List<Obj> list = new ArrayList<>(n);
for (int x = 0; x < n; x++) {
for (int y = 0; y < n; y++) {
list.add(f[x][y]);
}
ret += lineScore(list);
list.clear();
}
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
list.add(f[x][y]);
}
ret += lineScore(list);
list.clear();
}
return ret;
}
static int lineScore(List<Obj> list) {
boolean[] ex = new boolean[n];
Arrays.fill(ex, true);
int[] cnt = new int[n];
for (Obj o : list) {
for (int i = 0; i < n; i++) {
ex[i] = ex[i] && o.ex[i];
cnt[i] += o.cnt[i];
}
}
int ret = 0;
for (int i = 0; i < n; i++) {
if (ex[i]) {
ret += cnt[i] - 3;
}
}
return ret;
}
static class Obj {
int x, y;
int[] d = new int[n];
int[] cnt = new int[n];
boolean[] ex = new boolean[n];
}
}
ks2m