質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

307閲覧

Atcoder 競技プログラミングの鉄則 演習問題集 第5問のREになってしまう理由がわからないです。

TMYchan

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2025/09/16 03:28

0

1

実現したいこと

ソートコードの原因解説と私のコードをどのように修正すればよろしいでしょうか?

発生している問題・分からないこと

私のコードでコンパイル提出するとREになってしまいます。

該当のソースコード

python

1N,K = map(int, input().split()) 2count = 0 3 4for i in range(1, N+1): 5 for j in range(1, N+1): 6 for z in range(1, N+1): 7 if i+j+z == K: 8 count += 1 9 10print(count)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

特に変更したりAIは使ってません。

補足

特になし

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

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

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

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

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

melian

2025/09/16 05:48

入力例2の場合、ループ回数は 3000**3 = 27,000,000,000 回(270億回)になります。手元のPC(Intel Core i5-8500T (6)/3.50 GHz)で実行すると10分経過しても終了しません。つまり、制限時間オーバーになっていると考えられます。なので、修正方法としては総当り(brute force)ではなく適切なアルゴリズムを採用することになります。
TakaiY

2025/09/16 05:55

僕も時間がかかることが問題かと思ったのですが、その場合REでなくTLEになるんじゃないかと思って黙ってましたがどうなんでしょう。
melian

2025/09/16 07:09

三重ループを二重ループにするとループ回数は900万回になります。先程の環境では1.77秒で完了なので間に合うかもしれません。もっと効率的な方法があるかと思いますが、参考にしてみてください。 https://www.mycompiler.io/view/598zz3iL7CF
bsdfan

2025/09/16 08:49

時間がかかりすぎているのならREではなくTLEになると思います。 ひとつ前の質問でも、正常に動作する回答のものでREになったりしているようなので、コピペでのミスとか、その辺も注意してみたほうがいいように思います。 pythonの場合、インデントでのエラーもREになると思います。
meg_

2025/09/16 10:40

> Atcoder 競技プログラミングの鉄則 演習問題集 第5問のREになってしまう理由がわからないです。 URLは追記できますか? > 特に変更したりAIは使ってません。 何の話ですか?「試したこと・調べたこと」を記入する欄なのでプログラムの補足情報は本文に書く情報かと思います。
actorbug

2025/09/16 12:53

REになると言っているのは、こちらの提出結果のことでしょうか。 https://atcoder.jp/contests/tessoku-book/submissions/69378422 こちらですが、Atcoder 競技プログラミングの鉄則 演習問題集 第5問ではなく、第1問に対して回答しています。 第5問に回答したいのであれば、こちらのページにソースコードを入力してください。 https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_e
kikukiku

2025/09/16 23:34

>こんな感じにすると計算量が更に半分にできそう。 >https://www.mycompiler.io/view/E4Nl6x3p9Vz 上記では計算量を半分にできないことが判明しました。 すみません。取り下げます。
TMYchan

2025/09/17 03:17 編集

@actorbugさん 解答ありがとうございます。以下のリンクで再度提出しましたら、結果がTLEになりました。 しかし、上のコードだとなぜ時間がかかりすぎてしまうのですがなぜでしょうか。
TakaiY

2025/09/17 04:22

> 結果がTLEになりました。 > しかし、上のコードだとなぜ時間がかかりすぎてしまうのですがなぜでしょうか。 この問題って、「1 章:アルゴリズムと計算量」の題名にもありますが、パッと思いつく方法だと計算量が多くて時間がかかりすぎてしまう問題を、適切なアルゴリズムを1つまたは複数適用することで制限時間内に解けるようになること、が目的の演習問題です。 なので、アルゴリズムや計算量の見積り方などを勉強してこの問題が解けるようになりましょう。って感じですね。
kikukiku

2025/09/17 06:56

TMYchanさんのアルゴリズムは、 Nの3重ループになっているので、 最大3000×3000×3000=270億回ループすることになります。 アルゴリズムを工夫することで Nの2重ループにすることができます。 3000×3000=900万回 上記にようにすれば、3000倍処理速度を上げることができるということですね。 2重ループへの仕方は、すでに他の方が回答している通りです。
guest

回答1

0

質問へのコメントにも書かれていますが,提示されたコードでは実行時間の条件を満たせないと思われますので,少し視点を変えた方法を示します。

1枚目のカードが i1N)の場合,残り(j = K - i)に着目すると以下のことが言えます。

  • j が2枚目と3枚目のカードの和の範囲(2N + N)外の場合は条件を満たさないのでカウントは不要

  • jN + 1 以下の場合は,2枚目も3枚目も 1 以上が条件なので2枚目と3枚目の和が j に一致する場合の数は j - 1 通り

  • jN + 1 を超える場合は,3枚目が N 以下なので2枚目は j - N 以上の必要があり,求める場合の数は N - (j - N - 1) 通り

これらを基にした記述例を下記に示します。

また,AtCoder への 提出結果 も参照ください。

Python

1N, K = map(int, input().split()) 2count = 0 3 4for i in range(1, N + 1): 5 j = K - i 6 if j < 2: 7 continue 8 elif j <= N + 1: 9 count += j - 1 10 elif j <= N + N: 11 count += N + N - j + 1 12 13print(count)

投稿2025/09/17 04:11

編集2025/09/17 06:17
little_street

総合スコア515

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

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

kikukiku

2025/09/17 07:46

実行時間制限が2秒なんですね。 ちゃんと問題文を読んでいなかったです。 2秒なら1重ループにおさめておかないと無理ですね。 すばらしい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問