2

私はオンライン裁判官の問題(http://www.codechef.com/BTCD2012/problems/DOORS )を解決しようとしていました。問題のコードは次のとおりです。提出すると、審査員がランタイムエラー(その他)を出します。メモリを使いすぎている場合は、他の方法を見つけるのを手伝ってください。メモリは特定の制約に従って使用されているためです。 。

制約は次のとおりです。

0 <t1 <1000000;

0 <num <100000000;

#include<stdio.h>
int a[100000001];
int main()
{

    int  t=3,j,k1,g,k=1,m,n=0,i,t1,num;
    for(i=1;i<10000;i++)
    {
        m=i*i;
        n=n+t;
        for(j=m;j<=n;j++)
        {
            a[j]=k;
        }
        k++;
        t=t+2;
        // printf("a[%d]--> %d\n",n,a[n]);
   }

   scanf("%d",&t1);

   for(k1=0;k1<t1;k1++)
   {
       scanf("%d",&num);
       printf("%d\n",a[num]);
   }
   getch();
   // return 0;
}
4

4 に答える 4

1
int a[100000001];

この行が問題であり、静的割り当て領域に割り当てられているメモリが多すぎます。提案されているように、malloc()を使用してこのメ​​モリをヒープに割り当てることができます。

よりスリムな方法は、ビットの配列を使用することです[各ビットはドアを表します。ドアの開閉状態を表すには、オンとオフを切り替える必要があります]。実装するのは少し難しいですが、プログラムははるかにスリムになり(少なくとも16倍、C intは少なくとも2バイト、16ビット)、はるかに高速になります。

于 2012-08-23T19:48:41.847 に答える
1

この線:

int a[100000001];

スタックに 381.5 MB のメモリを割り当てようとします。これはランタイムが処理するには大きすぎる可能性が高いため、プログラムを終了しています。

本当にそんなに多くの int が必要ですか?

本当に多くのメモリが必要な場合は、代わりにヒープに割り当ててみてください。

グローバルをポインターに変更します。

int *a;

の開始時にmain()

a = malloc(sizeof(int)*100000001);
if(!a)
{
   printf("Could not allocate contiguous block\n");
   return -1;
}
于 2012-08-23T19:07:22.740 に答える
0

まず最初に良い質問です:-) そのための「+1」。あなたの質問に、これほど多くのメモリが必要であると確信している場合は、メモリを動的に割り当てることを常にお勧めします。を試してみてmallocくださいvariable a。何バイトint使ってる?unsigned long long必要がないことが確実な場合は、さらに使用することをお勧めしますsigned bits

unsigned int* a ;
a = malloc( sizeof(int) * 100000001 ) ;

上記の回答とコメントは非常に役に立ちます。

于 2012-08-28T07:13:43.887 に答える