晚上在牛客网练习编程,做了一题网易的,很简单的题但是会提示“程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)”,想来想去也不懂为什么,本地可以测试通过,然后既没有数组越界也没有调用递归。。。后面找到了原因,有可能是数组界定太大了,在给数组赋值的时候系统发生错误。
_________________________________________
题目如下:
时间限制:1秒
空间限制:32768K
题目描述
小易有一个长度为N的正整数序列A={A[1], A[2], A[3], …, A[n]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i]*A[i+1](1<=i<=N-1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。
输入描述:
输入的第一行为数列的个数t(1<=t<=10)
接下来每两行描述一个数列A,第一行为数列长度n(1<=n<=10^5)
第二行为n个正整数Ai(1<=Ai<=10^9)
输出描述:
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No
示例1
输入
2
3
1 10 100
4
1 2 3 4
输出
Yes
No
_______________________________________________________________
原来的解决代码:(个人猜想注释部分是出错原因)
#include<iostream>
using namespace std;
int main(){
int n,line,a[10000]; //这里定义
cin>>line;
for(int j = 0 ; j < line ; j++){
cin>>n;
int countMod4 = 0;
int countMod2 = 0;
for(int i = 0; i < n ; i++)
{
cin>>a[i]; //这里出错
if (a[i]%4 == 0)
countMod4++;
else if (a[i]%2 == 0)
countMod2++;
}
if ((countMod4 >= n/2)||(countMod2 >= n-countMod4*2))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
就很简单的思维,先把数传进数组,然后判断,如果是4的倍数的数比一半(向下取整)多,那肯定是YES,如 _ 4 _ ,(横线是任意数都可以)。要不然就是2的倍数(非4倍数)的数比总数减去两倍的4的倍数的数量多,也是可以的。因为一个4的倍数可以占两个位置。比如 _ 4 _ 4 _ _ _ (这五个横线都代表不是4的倍数,只要其中有三个数是2的倍数就可以了,放在最右边那么条件就一定成立),比如 _ 4 _ 4 2 2 6 。
————————————————————————————————
嗯。。本地测试是完全没问题的。。答案也和测试用例一致。。但是提交程序的时候牛客网显示:
程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)
我就觉得很奇怪,,按理说我啥也没干啊。。后面找到了原因
把a[i]改成x就好了,,想来也是傻了,,其实根本用不到数组存储的功能,,直接处理不就行了。。
修改后的代码通过所有测试用例,程序正确:
#include<iostream>
using namespace std;
int main(){
int n,line,x;
cin>>line;
for(int j = 0 ; j < line ; j++){
cin>>n;
int countMod4 = 0;
int countMod2 = 0;
for(int i = 0; i < n ; i++)
{
cin>>x;
if (x%4 == 0)
countMod4++;
else if (x%2 == 0)
countMod2++;
}
if ((countMod4 >= n/2)||(countMod2 >= n-countMod4*2))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
关于这个问题我猜想是牛客网的编译系统没办法处理在数组索引值较大的时候直接赋值,所以比如当cin>>a[9999]这样的时候数组就会发生越界错误,但是其实并没有越界,可能是牛客网编译系统对于输入的时候数组最大的界有范围限制吧。。
但是如果真的遇到编程题需要输入这么大的数组的时候,,就cin>>x; a[i] = x;好了。。。
嗯,,一题这么简单的编程题浪费了我一小时的时间包括写博客的时间。。= =还是太年轻了