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

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

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

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

Q&A

解決済

2回答

1754閲覧

競プロの回答がTLEとなる

souu

総合スコア5

C++

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

0グッド

0クリップ

投稿2019/08/13 07:10

https://atcoder.jp/contests/abc051/tasks/abc051_b
上記のAtcoderの問題の回答がTLE(実行時間制限超過)になってしまいます。
原因と対処法を教えて下さい。```c++
コード
#include<bits/stdc++.h>
using namespace std;
int main(){
int k,s;
cin >> k >> s;
int df = 0;
for(int x = 0;x <= k;x++){
for(int y = 0;y <= k;y++){
for(int z = 0;z <= k;z++){
int gh = x + y + z;
if(gh == s){
df++;
}
}
}
}
cout << df << endl;
}

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

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

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

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

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

pepperleaf

2019/08/13 07:56

ルール見ると、個人で戦う必要があります。とありますが、問題無いですか?
set0gut1

2019/08/13 08:03

コンテスト期間が終わった過去問については情報交換して大丈夫ということになっていると思います
guest

回答2

0

ベストアンサー

大方針:とにかく繰り返しの回数を減らすこと。特に多重ループは、掛け算で計算回数を増やします。できれば、繰り返し処理そのものを省ければ一番。

1.とりあえず、今のプログラムでひとつx+y+zの組み合わせを見つけたら、少なくともそれ以降のzの探索は確実に無駄ですから、

C++

1 for(int z = 0;z <= k;z++){ 2 int gh = x + y + z; 3 if(gh == s){ 4 df++; 5 break; 6 } 7 }

とするぐらいはノーヒントで思いついて欲しいと思います。

2.ループの範囲だって制限できるでしょう。
s-x<0だったりs-x>2kなら条件を満たすy,zはありません。
つまり、xの探索ループの下限値は0とs-2kの大きい方、上限値はkとsの小さい方、となります。
s-x>kなら、yがs-x-k未満には解はありません。
s-x<kのときには、yがs-xを超える解はありません。
言い換えれば、yの探索ループの下限値は0とs-x-kの大きい方、上限値はkとs-xの小さい方、となります。

x,yが決まったら、z=s-(x+y)として 0 ≦ z ≦ k であることを確かめればいいだけで、(ちゃぶ台返しになりますが)そもそもzについてループを回す必要はないでしょう。

3.さらに言えば、
xの範囲は上記で決まるとしてs-x=y+zを満たす整数y,zの組は
s-x≦kならs-x+1組
s-x>kなら2k-(s-x)+1組
になるんじゃないかしら。

これらを考え合わせると、ループなんて一つも使うこと無く求められるわけですよね。

つぶやき。
初心者にループを説明するときの例題に、1~nまでの和をforループでまじめに? 一つずつ足して求めるというのがありますよね。数列の和を求めるという視点では「不適切」と言っても過言ではないやり方を教えていることになると思うのですけれど。そういう型にハマってしまっていたりするのでしょうか。

投稿2019/08/13 09:58

thkana

総合スコア7652

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

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

0

For文の数を減らしましょう

投稿2019/08/13 07:33

Nippun

総合スコア1147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問