根据问题,我们必须找出元素是否超过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;
}
答案 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;
}