2016-08-04 10 views
-2

私はちょうどCを学び、オンラインで練習を始めました。 this question on codechef.comの投稿コードが間違っているとサイトから聞かれました。このコードが動作しない理由を理解できる人がいますか?

しかし、Macの端末でコードを実行したときにうまくいきました。

何が問題になったのか理解してもらえますか?本当にありがとう!また、コードのデバッグや改善について他の人に助けを求めることができるサイトを知っている人はいますか?

#include <stdio.h> 

int main() { 
    int T, N; 
    scanf("%d", &T); 
    int ans[T]; 
    for (int i = 0; i < T; i++) { 
     int max = 0; 
     long long P, Q; 
     scanf("%d %lld %lld", &N, &P, &Q); 
     long long A[N]; 
     for (int j = 0; j < N; j++) { 
      scanf("%lld", &A[j]); 
     } 

     for (int k = 0; k < N; k++) { 
      int quo = A[k]/2; 
      int r = A[k] % 2; 
      if (Q == 0 && quo > 0) { 
       P = P - ((2 * quo) + r); 
      } else { 
       Q -= quo; 
       P -= r; 
      } 
      if ((P >= 0) && (Q >= 0)) { 
       max++; 
      } 
     } 
     ans[i] = max; 
    } 
    for (int m = 0; m < T; m++) { 
     printf("%d\n", ans[m]); 
    } 
} 
+3

ここにコードを投稿すると良いスタートポイントになることができます.... – LPs

+1

@LPsの編集に感謝します – b02b01

+2

間違いなく、すぐにオフトピックとしてスラムされます。コードはCRで動作する必要があります。この質問は、StackOverflowのために少し余裕があります。 OP、あなたはMCVEを作成する必要があります - 最小限で、完全で、証明可能な例。少なくとも、問題を解決しようとしたことを説明する必要があります。 "Fix this pls"はSOの話題です。 –

答えて

0

int ans[T];が必要とされていないローカル自動配列は、あなたが出力あなたのように結果がそれらを計算することができます。 T9999999と同じくらい大きくなる可能性があります。このような大きな配列を自動ストレージに割り当てると、スタックスペースが制限されたシステム(< 4 MB)で未定義の動作が呼び出される可能性があります。

Macで実行したテストは、codechefで実行したテストと同じではありません。膨大な数のテストケースを通過させてプログラムを破る可能性があります。

さらに、あなたのアルゴリズムでは、複数の欠陥があります。

  • をあなたは試してみて、2ルピー硬貨変化を与える可能な限り、しかし、あなたは2ルピー硬貨が不足したときに、この問題が発生したため乗客はいないかもしれません正しい変更を取得します。
  • まず乗客の数を最大限にしようとするには、あまり変更を必要としない乗客に変更を加える必要があります。コード化されているので、乗客が莫大な金額を支払った場合、変更が余りに速くなくなる可能性があります。
  • あなたが乗客をカウントする方法は間違っています:あなたがまだ変更を行っているという事実は、乗客が乗っていたことを意味するものではなく、最後に乗客が間違ってカウントされている可能性があります。
関連する問題