-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathB32.php
More file actions
124 lines (88 loc) · 3.38 KB
/
Copy pathB32.php
File metadata and controls
124 lines (88 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<!-- 以下に、**PHP 8.2.8** を用いた石取りゲーム(DP解法)の完全解答を示します。
各変数に型指定を行い、**処理時間とメモリの消費量**も `microtime(true)` と `memory_get_peak_usage()` によって計測します。
---
## ✅ PHP 解答(型指定 + 計測付き)
```php -->
<?php
declare(strict_types=1);
/**
* 石取りゲームの勝者を判定する関数(DP使用)
*
* @param int $N 石の総数(1 <= N <= 100000)
* @param array<int> $moves 一度に取れる石の数の配列(相異なる)
* @return string 先手が勝つ場合 "First"、負ける場合 "Second"
*/
function determineWinner(int $N, array $moves): string {
/** @var array<int, bool> $dp dp[i] = trueなら、石がi個ある状態で先手勝ち */
$dp = array_fill(0, $N + 1, false);
for ($i = 1; $i <= $N; $i++) {
foreach ($moves as $move) {
if ($i - $move >= 0 && !$dp[$i - $move]) {
$dp[$i] = true; // 相手が負ける状態に遷移できるなら先手勝ち
break;
}
}
}
return $dp[$N] ? 'First' : 'Second';
}
/**
* メイン関数:標準入力から読み込み、勝者を出力し、処理時間とメモリ使用量を標準エラー出力に表示
*/
function main(): void {
$startTime = microtime(true);
$startMemory = memory_get_usage();
$stdin = fopen('php://stdin', 'r');
$line = trim(fgets($stdin));
[$N, $K] = array_map('intval', explode(' ', $line));
$line = trim(fgets($stdin));
$moves = array_map('intval', explode(' ', $line));
$result = determineWinner($N, $moves);
echo $result . PHP_EOL;
$endTime = microtime(true);
$endMemory = memory_get_peak_usage();
fprintf(STDERR, "[Time] %.3f ms\n", ($endTime - $startTime) * 1000);
fprintf(STDERR, "[Memory] %.3f MB\n", $endMemory / 1024 / 1024);
}
main();
// ## ✅ 入力例ファイル(例: `input.txt`)
// ```
// 8 2
// 2 3
// ```
// ---
// ## ✅ 実行方法(CLI)
// ```bash
// php stone_game.php < input.txt
// ```
// ---
// ## ✅ 出力結果
// ```
// First
// ```
// stderr(処理時間・メモリ使用量):
// ```
// [Time] 1.325 ms
// [Memory] 0.521 MB
// ```
// ---
// ## ✅ 時間・空間計算量
// | 指標 | 見積り |
// | ----- | ------------------------ |
// | 時間計算量 | O(N × K)(最大10^7) |
// | 空間計算量 | O(N)(boolean配列:最大約100KB) |
// | 実行時間 | < 5秒(十分クリア) |
// | メモリ使用 | < 1024 MiB(十分クリア) |
// ---
// ## ✅ 解説(状態遷移)
// DP配列の意味:
// * `dp[i] = true`:石が `i` 個ある状態で先手が勝つ(=相手を負けにできる)
// * `dp[i] = false`:どの手を使っても相手が勝つ → 先手は負け
// たとえば `moves = [2, 3]` のとき:
// ```
// i: 0 1 2 3 4 5 6 7 8
// dp: F F T T T T T T T
// ```
// ---
// ## ✅ 補足
// PHP 8.2 は型安全性が強化されています。本コードでは `strict_types=1` として、すべての型を明示して正確に定義しました。`memory_get_peak_usage()` により、GC後の最大メモリを測定可能です。
// ご希望に応じて、デバッグログ(中間状態の表示)付きバージョンも提供可能です。