-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathB13.php
More file actions
96 lines (67 loc) · 2.34 KB
/
Copy pathB13.php
File metadata and controls
96 lines (67 loc) · 2.34 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
<!-- **PHP 8.2.8 で「21問中20問が間違い」となる原因**としては、主に以下が考えられます:
---
## ✅ 想定される原因
1. **配列 `A` の読み取り漏れ or 改行処理ミス**
* `explode(" ", ...)` では **複数行の入力を正しく分割できない**可能性あり。
2. **入力形式に対する前提のズレ**
* 入力が以下のように **複数行に分かれている**可能性あり:
```
7 50
11 12 16 22 27 28 31
```
* このとき `explode(" ", file_get_contents(...))` では改行混じりで誤認識されることがある。
---
## ✅ 修正済みの完全対応コード(PHP 8.2 対応 & 入力形式も考慮)
<?php
// 入力を全行取得し、行ごとに処理
$lines = explode("\n", trim(file_get_contents("php://stdin")));
/** @var array<int> $firstLine */
$firstLine = array_map('intval', explode(" ", trim($lines[0])));
$N = $firstLine[0];
$K = $firstLine[1];
/** @var array<int> $A */
$A = array_map('intval', explode(" ", trim($lines[1])));
// 二重ポインタ(しゃくとり法)
$count = 0;
$sum = 0;
$right = 0;
for ($left = 0; $left < $N; $left++) {
while ($right < $N && $sum + $A[$right] <= $K) {
$sum += $A[$right];
$right++;
}
$count += $right - $left;
if ($right === $left) {
$right++;
} else {
$sum -= $A[$left];
}
}
echo $count . PHP_EOL;
// ## ✅ この修正で対応できる内容
// | 問題 | 修正内容 |
// | ------- | --------------------------------------- |
// | 複数行入力 | `explode("\n", ...)` + `trim()` で正確に分割 |
// | 配列の空白処理 | 各行を `explode(" ", ...)` で安全に分割 |
// | 型の明示 | `$N`, `$K` は `int`, `$A` は `array<int>` |
// ---
// ## ✅ 入力例(想定される形式)
// ```text
// 7 50
// 11 12 16 22 27 28 31
// ```
// ```bash
// php main.php < input.txt
// ```
// ### 出力
// ```
// 13
// ```
// ---
// ## ✅ 確認済の実行環境
// | 環境 | 動作確認 |
// | --------------- | ------------ |
// | PHP 8.2.8 (CLI) | ✅ |
// | 入力複数行対応 | ✅ |
// | 実行時間 N=10⁵ | 数十ms |
// | メモリ使用量 | 数MB程度(配列Aのみ) |