2013-06-08 3 views
1

В соответствии с проблемой мы должны определить, существует ли элемент более n/2 раза или нет, а затем напечатать Yes или No соответственно. Числа могут варьироваться от 10^-3 до 10^3.SPOJ MAJOR (получение ошибки Runtime)

Я взял подсчет массива [2005], а затем добавил 1000 к каждому входу, чтобы сделать 10^-3 равным 0, т. Е. -1000 + 1000 = 0, а затем сохранить количество входящих в счетчик -1000 [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; 
} 

ответ

2

Проблема в свой код «вы не читаете вход полностью, SPOJ требует, чтобы ваша программа должна полностью прочитать вход, не подкапывают средний «..

Решение вашей проблемы: просто возьмите обертку размера (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; 
} 
Смежные вопросы