0

ジョリージャンプ問題(ACM 10038 uva)のソリューションコードを書きました。私のコードは次のとおりです。

#include<stdio.h>
#include<stdlib.h>

int main(){
  int count=0;
  int Number[3000]={0};
  int Absolute[3000]={0};
  bool flag=true;
  while(scanf("%d",&count)){
   for(int i=0;i<count;++i){
     scanf("%d",&Number[i]);
     Absolute[i]=0;
   }
   for(int j=0;j<count-1;++j){
     int diff=Number[j]-Number[j+1];
     if(diff<0)diff*=-1;
     Absolute[diff]=1;
   }
   flag=true;
   for(int x=1;x<count;++x){
     if(Absolute[x]!=1){
       flag=false;
       break;
     }
   }
   if(flag)printf("Jolly\n");
   else printf("Not Jolly\n");
 }
 return 0;
}

しかし、結果として制限時間を超えました。なんで?実行時間を短縮するためにコードを修正するにはどうすればよいですか?

4

3 に答える 3

2

プログラムが終了しないため、プログラムが制限時間を超えている可能性があります。scanf()が戻った場合EOF、以下はループを停止しません。

while(scanf("%d",&count)){
    // whatever...
}

これらのオンラインプログラミングの問題では、通常、提案されたソリューションを質問で提供されたサンプルデータに対して実行し、期待される出力が得られるかどうかを確認することをお勧めします。プログラムが期待どおりの出力を生成しない場合は、修正する問題があることがわかります(そして、デバッグするための具体的なものがあります)。

于 2012-11-24T08:22:15.733 に答える
1

無限ループ!に置き換えるだけwhile(scanf("%d",&count))while(scanf("%d",&count) != EOF)完了です。

差出人man scanf

戻り値

   These  functions  return  the  number  of  input items successfully
   matched and assigned, which can be fewer than provided for, or even
   zero in the event of an early matching failure.

   The  value  EOF  is  returned if the end of input is reached before
   either the  first  successful  conversion  or  a  matching  failure
   occurs.  EOF is also returned if a read error occurs, in which case
   the error indicator for the stream  (see  ferror(3))  is  set,  and
   errno is set indicate the error.

私も競争相手です。私があなたに与えることができる1つのヒントは、常に入力ファイル(in.txt)と出力ファイル(out.txt)を作成し、入力をプログラムにリダイレクトし、以下を使用して出力を比較することdiffです。

$ cat in.txt
4 1 4 2 3
5 1 4 2 -1 6

$ cat out.txt
Jolly
Not jolly

$ ./jolly_jumpers < in.txt > my_out.txt

$ diff -s out.txt my_out.txt
Files out.txt and my_out.txt are identical
于 2012-11-26T22:24:22.280 に答える
0

私はすでに前にそれに答えました。

私がしたことは、2つのそれぞれの要素の差をベクトルに追加し、最後にそれをソートすることでした。

ここで行う必要があるのは、このベクトルのすべての要素が前の要素よりも正確に1多いかどうかを確認することだけです。また、このソートされたベクトルの最初の要素が1であり、最後の要素がn-1であることを確認します。

于 2012-11-24T08:08:26.960 に答える