2016-11-08 17 views
-3

ちょっとハッカーの問題を解決しようとしていますが、いくつかのテストケースではコードのタイムアウトと私はなぜわかりません。 This is the challengeHackerrankのチャレンジのタイムアウト

そして、ここに私のコードです:

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 

int main(){ 
    int n, k, q; 
    scanf("%d %d %d",&n,&k,&q); 
    int qs[q]; 
    int a[n]; 

    for(int i = 0; i < n; i++){ 
     scanf("%d", &a[i]); 
    } 


    for(int i = 0; i < q; i++){ 
     scanf("%d",&qs[i]); 
    } 

    int lastNbr = a[n-1]; 
    for(int i = 0; i < k; i++){ 
     lastNbr = a[n-1]; 
     for(int j = n - 1; j > -1; j--){ 
      a[j] = (j-1 >= 0) ? a[j-1] : lastNbr; 
     } 
    } 

    for(int i = 0; i < q; i++){ 
     printf("%d\n", a[qs[i]]); 
    } 

    return 0; 
} 
+3

あなたが書いたとおり、**あなた**はそれを解決しようとしています。 **私たちが**行った場合、公正ではないでしょう... - あなたは**具体的な**質問がありますか? – Olaf

+0

秘密は配列を回転させる必要はないということです。 '%'演算子はあなたの友人です。 –

+0

@Olafほとんどのテストケースは動作していますが、タイムアウトしているコードを送信すると意味します。私のコードの一部でタイムアウトが発生するというヒントを教えていただければ幸いです。 :) – Nimmi

答えて

1

すべての権利は、あなたのアルゴリズムの時間計算量を分析することで起動できます:

あなたが回転する2は、常にn * k操作のために行くループの入れ子になっていあなたの配列k回と回転を行うためにn操作が必要です。

これはO(n * k)となるので、最悪の場合の入力では約10^10であり、これは非常に多くの操作です。

アルゴリズムの複雑さを計算する方法については、最初にthis記事をお読みください。非常に有用な情報が提供されており、実際の例で説明しています。

ここで、アルゴリズムを再考し、時間の複雑さを改善する必要があります。私はあなたに解決策を躊躇させませんが、私はあなたにヒントを与えることができます:k単位を1単位で回転させる必要はないと思ってください。代わりにk単位で1回だけ行うことができます。

願わくばこれは、チャレンジの解決に役立ちます。 :)

+0

挑戦の一部は、必要な時間にOPが実行を完了するためのものであり、失敗した場合は実行できません。私達は彼/彼女のために答えると、彼らは何を学んだのですか(助けを求めることは自分自身を学ぶよりも簡単です) – KevinDTimm

+0

私は解決策を打ち砕かなかった、私は時間の複雑さを勉強するヒントと記事しか与えなかった。たぶん彼はこれらの知識をまだ持っていないし、どこで勉強を始めるべきかも知らない。また、問題の解決策を見つけられない場合は、ヒントを尋ねるだけで時間を費やすだけではありません。個人的には、問題で長すぎると思っても、1〜2週間後にそれを理解しても、時間がかなり失われています。 –

+0

@VladTarniceruご協力いただきありがとうございます。そして、はい、私はこのアルゴリズムのトピックではかなり新しいので、私は本当にこの分野で多くの知識を持っていないので、私はちょうどcを学び始めました。 – Nimmi

0

あなたのコードを見れば、それはo(n * k)の解です。あなたはそれをo(n)時間で解決することができます。そして、入力サイズは10パワ5です。そのため、タイムアウトエラーが発生しています。 %があなたを助けます。