1

問題によると、要素が n/2 回以上発生するかどうかを調べ、それに応じて Yes または No を出力する必要があります。数値は 10^-3 から 10^3 までさまざまです。

配列 count[2005] を取得し、各入力に 1000 を追加して 10^-3 を 0 に等しくします。残りの要素。したがって、下限= -1000+1000=0; 上限= 1000+1000=2000;

しかし、それでもメモリアクセス違反が発生します。助けてください... 元の問題へのリンクは次のとおりです: http://www.spoj.com/problems/MAJOR/

#include<stdio.h>
int main()
{
    int t,n,a,count[2005],max,check,temp;
    scanf("%d",&t);
    while(t--)
    {
              check=0;
              scanf("%d",&n);
              for(int i=0;i<2005;i++)
                      count[i]=0;
              for(int i=0;i<n;i++)
              {
                      scanf("%d",&a);
                      temp=a+1000;
                      count[temp]++;
                      if(count[temp]>(n/2))
                      {
                                         check=1;
                                         max=temp-1000;
                                         break;
                      } 
              }
              if(check==1)
                          printf("YES %d\n",max);
              else
                  printf("NO\n");

    }
    return 0;
}
4

1 に答える 1

2

コードの問題は、「入力を完全に読み取っていません。SPOJ は、プログラムが途中で中断するのではなく、入力を完全に読み取る必要があることを要求しています。」.

問題の解決策: サイズ (10^6+1) の arr を取得し、最初にすべての入力を読み取ってから、 algorithm を適用します。入力の読み取り中に中断した場合も、これを覚えておいてください。常に SIGSEGV になります。そのため、常にすべてのプログラミング Web サイトで入力を完全に読み取ります

ここに変更したコードがあり、AC を取得する準備ができています。見てみな !

#include<stdio.h>
int arr[1000002]; // Array of Size (10^6+2)
int main()
{
    int t,n,a,count[2005],max,check,temp,i;
    scanf("%d",&t);
    while(t--)
    {
              check=0;
              scanf("%d",&n);
              for(int i=0;i<2005;i++)
                      count[i]=0;

              for(i=0;i<n;i++)
                       scanf("%d",&arr[i]);  // READING INPUT FULLY IN AN ARRAY

               for(i=0;i<n;i++)
              {
                      a=arr[i]; // Now, a=arr[i] and previous algorithm applies now 
                      temp=a+1000;
                      count[temp]++;
                      if(count[temp]>(n/2))
                      {
                                         check=1;
                                         max=temp-1000;
                                         break;
                      } 
              }
              if(check==1)
                          printf("YES %d\n",max);
              else
                  printf("NO\n");

    }
    return 0;
}
于 2013-06-23T07:23:17.990 に答える