質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

471閲覧

RE(Runtime Error)となる理由を教えていただきたいです

cunwe

総合スコア65

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/25 09:33

こちらの問題の解答コードが以下になるのですがwhile文の中のwhile文の中のwhile文の条件式でi < N &&を追記すればAC(Accepted)となるのですが、これがないとRE(Runtime Error)となってしまうのですが原因がわかりません。該当のwhile文を囲っているwhile文の条件がi < Nなので不要だと思ったのですが。。REの原因としてオーバーフロー、return 0;忘れがあるそうなのですが今回はそれに該当しないかと思います。原因がわかる方、よろしくお願い致します。

#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int N; cin >> N; vector<int> h(N); for (int i = 0; i < N; ++i) cin >> h[i]; // 高さが全部 0 になるまでやる int res = 0; while (true) { // 最高高さが 0 だったらおしまい if (*max_element(h.begin(), h.end()) == 0) break; // 区間分割する int i = 0; while (i < N) { if (h[i] == 0) ++i; // 0 なら何もせずに次に進む else { ++res; // 区間の始まり while (/*i < N && */h[i] > 0) { --h[i]; // ついでに引いとく ++i; // 区間の終わりまで一気に } } } } cout << res << endl; return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

該当のwhile文を囲っているwhile文の条件がi < Nなので不要だと思ったのですが

h[0]h[N-1]0以外が入力された場合、

C++

1 while (/*i < N && */h[i] > 0) { 2 --h[i]; // ついでに引いとく 3 ++i; // 区間の終わりまで一気に 4 }

iの値をチェックせずにループすることになるため、h[N]以降への範囲外アクセスが発生しています。

投稿2020/05/25 09:36

編集2020/05/25 09:40
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cunwe

2020/05/25 10:07

i < Nという条件のwhile文の中のwhile文でも範囲外アクセスしてしまうんですね。。学びました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問