結果
| 問題 |
No.3316 Make 81181819 with only 0,1,or 8
|
| コンテスト | |
| ユーザー |
msksknkn
|
| 提出日時 | 2025-10-31 22:35:52 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,325 bytes |
| コンパイル時間 | 2,562 ms |
| コンパイル使用メモリ | 83,472 KB |
| 実行使用メモリ | 452,636 KB |
| 最終ジャッジ日時 | 2025-10-31 22:36:06 |
| 合計ジャッジ時間 | 13,041 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 6 WA * 16 |
ソースコード
package q1;
import java.util.*;
public class Main {
public static TreeSet<Integer> set = new TreeSet<>();
public static int iwai = 81181819;
public static int[] ans = new int[iwai + 1];
public static boolean[] vis = new boolean[iwai];
public static HashMap<Integer,String> map = new HashMap<>();
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
make(0);
StringBuilder sb = new StringBuilder();
for(int c = 0;c < t;c++) {
int n = sc.nextInt();
int rem = iwai - n;
StringBuilder a = new StringBuilder();
String s = Integer.toString(rem);
//前からi桁目まで見て、直前の桁の値が0 ~ 7のいずれか処理してあるorしてなくて各桁で使う数の上限の最小値?
int[][] dp = new int[8][s.length() + 1];
for(int i = 0;i < 8;i++) {
for(int j = 0;j <= s.length();j++) {
dp[i][j] = 181;
}
}
dp[0][0] = 0;
for(int i = 1;i <= s.length();i++) {
int p = s.charAt(i - 1) - '0';
for(int j = 0;j < 8;j++) {
int sum = j * 10 + p;
int num = sum / 8;
int q = sum % 8;
//1を使う個数
for(int k = 0;k <= q;k++) {
if(i != n || q - k == 0)
dp[q - k][i] = Math.min(dp[q - k][i], Math.max(dp[j][i - 1],num + k));
//System.out.println(q + " " + k +" " + i + " " + dp[q - k][i]);
}
}
}//System.out.println(dp[0][s.length()]);
int ans = dp[0][s.length()];
int[] list = new int[ans];
int pos = 0;
int add = 1;
//どうやって復元するのおおおお
for(int i = s.length();i >= 1;i--) {
int v = s.charAt(i - 1) - '0' - pos;
for(int j = 0;j < 8;j++) {
if(dp[j][i - 1] > ans)continue;
int vd = v + j * 10;
int div8 = vd / 8;
int one = vd % 8;
if(div8 + one <= ans) {
for(int k = 0;k < div8;k++) {
list[k] += 8 * add;
}for(int k = 0;k < one;k++) {
list[k + div8] += add;
}pos = j;
break;
}
}add *= 10;
}for(int i = 0;i < ans;i++) {
a.append(list[i] + "\n");
}
sb.append(ans + "\n" + a);
}
System.out.print(sb);
}public static void make(int a) {
if(a > iwai) {
return;
}
if(a != 0) {
set.add(a);
make(a * 10);
}make(a * 10 + 1);
make(a * 10 + 8);
}
}
msksknkn