結果
問題 | No.45 回転寿司 |
ユーザー | aimBULL |
提出日時 | 2016-06-04 18:20:41 |
言語 | Java21 (openjdk 21) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,607 bytes |
コンパイル時間 | 2,164 ms |
コンパイル使用メモリ | 88,040 KB |
実行使用メモリ | 111,544 KB |
最終ジャッジ日時 | 2024-11-24 16:58:19 |
合計ジャッジ時間 | 178,245 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | TLE | - |
testcase_01 | TLE | - |
testcase_02 | TLE | - |
testcase_03 | TLE | - |
testcase_04 | TLE | - |
testcase_05 | TLE | - |
testcase_06 | TLE | - |
testcase_07 | TLE | - |
testcase_08 | TLE | - |
testcase_09 | TLE | - |
testcase_10 | TLE | - |
testcase_11 | TLE | - |
testcase_12 | TLE | - |
testcase_13 | TLE | - |
testcase_14 | TLE | - |
testcase_15 | TLE | - |
testcase_16 | TLE | - |
testcase_17 | TLE | - |
testcase_18 | TLE | - |
testcase_19 | TLE | - |
testcase_20 | TLE | - |
testcase_21 | TLE | - |
testcase_22 | AC | 117 ms
60,808 KB |
testcase_23 | AC | 119 ms
111,516 KB |
testcase_24 | AC | 120 ms
111,544 KB |
testcase_25 | AC | 108 ms
110,504 KB |
testcase_26 | TLE | - |
testcase_27 | TLE | - |
testcase_28 | TLE | - |
testcase_29 | TLE | - |
testcase_30 | TLE | - |
testcase_31 | AC | 121 ms
54,092 KB |
testcase_32 | AC | 119 ms
53,880 KB |
testcase_33 | TLE | - |
ソースコード
import java.util.ArrayDeque; import java.util.Arrays; import java.util.Deque; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] sushi = new int[n]; for(int i = 0; i < n && sc.hasNextInt(); i++){ sushi[i] = sc.nextInt(); } sc.close(); int[] memo = Main.calc(n, sushi); Arrays.sort(memo); System.out.println(memo[memo.length - 1]); } // データの格納領域を作成する public static int[] create(int n){ int[] memo = new int[(n + 1) / 2 + 1]; memo[0] = 0; for(int i = 1; i < memo.length; i++){ memo[i] = Integer.MIN_VALUE; } return memo; } // 最大の美味しさを計算する public static int[] calc(final int n, final int[] sushi){ Deque<Node> stack = new ArrayDeque<>(); int[] memo = create(n); // 1つ目の寿司を選んだ状態を処理スタックに追加 for(int i = 0; i < sushi.length; i++){ Node startNode = new Node(i, i, 1, sushi[i]); stack.push(startNode); } // 寿司1つの場合の最大美味しさは事前に計算する int[] tmp = sushi.clone(); Arrays.sort(tmp); memo[1] = tmp[tmp.length - 1]; while(stack.size() > 0){ Node current = stack.peek(); // 存在しない寿司は削除して次へ if(current.pos >= sushi.length){ stack.pop(); continue; } // 存在しない寿司を取る場合は削除して次へ final int pos = current.nextPos; if(pos >= sushi.length){ stack.pop(); continue; } // 最大の美味しさを更新 final int umami = current.totalUmami + sushi[pos]; final int dishes = current.dishes + 1; if(umami >= memo[dishes]){ memo[dishes] = umami; } // 次の寿司を選んだ状態を追加する stack.push(new Node(current.id, pos, dishes, umami)); // 今回とは別の寿司を選ぶため更新をかける current.nextPos++; } return memo; } } class Sushi{ int umami; int pos; public Sushi(int pos, int umami) { this.pos = pos; this.umami = umami; } } class Node extends Sushi{ @Deprecated int id; @Deprecated int dishes; int nextPos; int totalUmami; public Node(int id, int pos, int dishes, int totalUmami) { super(pos, -1); this.id = id; // 次にとることができる寿司は2つ以上離れている nextPos = pos + 2; this.dishes = dishes; this.totalUmami = totalUmami; } @Override public String toString() { return "{id=" + id + " dishes=" + dishes + " pos=" + pos + " nextpos=" + nextPos + " totalUmami=" + totalUmami + "}"; } }