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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

573閲覧

実行時間を要する場所がわからない

TKG000

総合スコア6

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/03/27 08:08

編集2022/03/27 11:22

AtCoderのC-Choose Elementsで一部TLEになってしまいます。どの部分が時間を要しているのか、どのように改善すれば良いのかご教授いただきたいです。よろしくお願いします。

問題:https://atcoder.jp/contests/abc245/tasks/abc245_c

【プログラムの説明】
入力の読み込みを行う。
スタックを用いる。
二つの配列tmp2,3の初めの要素二つをスタックに入れる。
スタックの上の要素を見て、絶対値差が条件に合っているものを順次入れていく。
(countはスタック中の要素がtmp2,3で何番目に値するのかを記憶しておくもの)
(pointは行き止まりにあたった時にすぐに分岐に戻れるように分岐点の添え字を記憶しておくもの)
行き止まりにあたると、記憶して置いた分岐点まで戻り、間違いの道をNaNとして選べないようにしてから再度同じ操作を行う。

JavaScript

1const fs= require('fs'); 2 3function Main(input){ 4 input=input.split("\n"); 5 var tmp1=input[0].split(" "); 6 var tmp2 = input[1].split(" "); 7 var tmp3=input[2].split(" "); 8 for(var i=0;i<tmp1.length;i++){ 9 tmp1[i]=parseInt(tmp1[i]); 10 } 11 for(var i=0;i<tmp2.length;i++){ 12 tmp2[i]=parseInt(tmp2[i]); 13 } 14 for(var i=0;i<tmp3.length;i++){ 15 tmp3[i]=parseInt(tmp3[i]); 16 } 17 18 var a=new Array(tmp1[1]); 19 var count=new Array(); 20 var t=0, s=0; 21  var point=new Array(); 22 var k=0, num=0; 23 24 a[t]=tmp2[s]; 25 count[t]=s; 26 a[++t]=tmp3[s]; 27 count[t]=s; 28 29 point[k]=s; 30 while(1){ 31 if(num===0){ 32 if(Math.abs(tmp2[s+1]-a[t])<=tmp1[1] && Math.abs(tmp3[s+1]-a[t])<=tmp1[1]){ 33 a[++t]=tmp2[++s]; 34 point[++k]=t; 35 count[t]=s; 36 a[++t]=tmp3[s]; 37 count[t]=s; 38 }else if(Math.abs(tmp2[s+1]-a[t])<=tmp1[1]){ 39 a[++t]=tmp2[++s]; 40 count[t]=s; 41 }else if(Math.abs(tmp3[s+1]-a[t])<=tmp1[1]){ 42 a[++t]=tmp3[++s]; 43 count[t]=s; 44 }else{ 45 t=point[k--]; 46 num++; 47 } 48 if(s===tmp1[0]-1){ 49 console.log('Yes'); 50 return; 51 } 52 }else{ 53 if(k<-1){ 54 console.log('No'); 55 return; 56 } 57 if(a[t+1]===a[t]){ 58 t=point[k--]; 59 }else{ 60 s=count[t]; 61 if(tmp2[s+1]===a[t+2]){ 62 tmp2[s+1]=NaN; 63 }else if(tmp3[s+1]===a[t+2]){ 64 tmp3[s+1]=NaN; 65 } 66 num=0; 67 } 68 } 69 } 70} 71 72Main(fs.readFileSync("/dev/stdin", "utf-8"));

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/03/27 08:41

タグの C#, C++ は関係ないのでは? 関係なければ外してください。タグで見ている人の迷惑になりますので。関係あるならどのように関係するのか書いてください。
TKG000

2022/03/27 09:31

すみません。修正致しました。
1T2R3M4

2022/03/27 11:16

プロファイリングでもしてみては。、
TKG000

2022/03/27 11:23

ありがとうございます。 ループごとに時間を計測してみます。
guest

回答2

0

分岐している個所だけにNaNを入れるのではなく、分岐している箇所に至るすべての箇所にNaNを入れるようにすれば、今のコードでもそれなりに速くなります。(メモ化と同様の効果が見込めるため)

現状、分岐している箇所にしかNaNを入れていないため、常に一方の選択肢は残り続けることになります。例えば、以下のような入力の場合に、1しかNaNに書き換えられません。そうなると、別のルートを試す際に毎回2を末尾までたどらなければならず、O(N^2)の時間がかかってしまいます。(入力例は長くなりすぎるので省略しています)

text

1200000 1 22 2 ... 2 4 31 1 ... 1 4

投稿2022/03/28 10:21

actorbug

総合スコア2224

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

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

TKG000

2022/03/28 11:18

一度たどった道をつぶしておくという方法は時間の短縮になりますね。一度試してみます。 回答ありがとうございます。
guest

0

ベストアンサー

「戻る」発想が間違いです。「戻る」ことで不必要な計算をして、処理時間を超過しています。
戻らない処理を考えてみてください。

投稿2022/03/27 13:35

k08045kk

総合スコア384

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

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

TKG000

2022/03/27 15:29 編集

ありがとうございます。
k08045kk

2022/03/27 15:34

説明が悪かったかもしれない。 「不必要な計算」は「同じ計算の繰り返し」の意味であって、「巻き戻し等の補足的な計算」のことを指しているわけではないのであしからず。 (「再帰」処理は、関数呼び出しのオーバーヘッドとかでもっと悪い状態になるのでは?)
TKG000

2022/03/28 11:09

試したところそうでした... やはり自分の考えを改良するだけでは解決できないのではと思いほかの解答を参考にすることにしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問