怎么开较大数组?
#include<iostream>
#include<stdio.h>
using namespace std;
struct jishu{
int s;
int a[50000];
};
int main()
{
int i,k,m,n,t,b[50000],v,u,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
jishu *p=new jishu[m];
for(i=0;i<=m;i++)
{
p[i].s=0;
}
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
p[b[i]].a[ p[b[i]].s]=i;
p[b[i]].s++;
}
ans=0;
for(i=1;i<=m;i++)
{
u=0;
v=p[i].s-1;
while(p[i].a[v]-p[i].a[u]+1-p[i].s>k)
{
if(p[i].a[u+1]-p[i].a[u]>p[i].a[v]-p[i].a[v-1])
u++;
else
v--;
p[i].s--;
}
if(p[i].s>ans)
ans=p[i].s;
}
printf("%d\n",ans);
delete []p;
}
return 0;
}
为什么一直是runtime error??? 命名空间 iostream
[解决办法]
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
栈区<数据区<堆区<文件大小<磁盘大小
[解决办法]
#include<iostream>
#include<stdio.h>
using namespace std;
struct jishu{
int s;
int a[50000];
};
int main()
{
int i,k,m,n,t,b[50000],v,u,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
jishu *p=new jishu[m];
for(i=0;i<=m;i++)//-------------- p指针超界
{
p[i].s=0;
}
for(i=0;i<n;i++) //------- n <=m <=50000
{
scanf("%d",&b[i]);
p[b[i]].a[ p[b[i]].s]=i;
p[b[i]].s++;
}
ans=0;
for(i=1;i<=m;i++) //--------------- p指针超界
{
u=0;
v=p[i].s-1;
while(p[i].a[v]-p[i].a[u]+1-p[i].s>k) //----------- p[i].a[v],p[i].a[u]可能无值
{
if(p[i].a[u+1]-p[i].a[u]>p[i].a[v]-p[i].a[v-1])//----- v-1有可能<0
u++;
else
v--; //----------- v有可能<1
p[i].s--;
}
if(p[i].s>ans)
ans=p[i].s;
}
printf("%d\n",ans);
delete []p;
}
return 0;
}