SPOJ MAJOR(获得运行时错误)

时间:2013-06-08 18:38:01

标签: c

根据问题,我们必须找出元素是否超过n / 2次,然后相应地打印是或否。 数字可以从10 ^ -3到10 ^ 3不等。

我采用数组计数[2005],然后在每个输入上加1000,使10 ^ -3等于0,即-1000 + 1000 = 0,然后在计数[0]中存储-1000的出现次数其余元素也一样。 因此, 下限= -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;
}

1 个答案:

答案 0 :(得分:2)

您的代码存在问题“您没有完全阅读输入,SPOJ要求您的程序应该完全读取输入,而不是在中间打破。”

解决您的问题:只需取一个大小的arr(10 ^ 6 + 1)并首先读取所有输入,然后应用算法。 请记住这一点,如果您在阅读输入时也会中断。它永远是SIGSEGV。因此,请务必在每个编程网站上完整阅读输入

这是您修改后的代码,它已准备好获得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;
}
相关问题