这两个代码有啥区别啊,上面这个我写的,下面这个别人的正确答案,但是我测试用例4个错三个,我不理解差在哪
#include
#include
using namespace std;
int main()
{
long long int N,Q;
cin>>N>>Q;
long long int p[N],d[N];
for(int i =1;i<=N;i++)
{
cin>>d[i];
p[i]=d[i]-d[i-1];
}
for(int i =1;i<=Q;i++)
{
long long int l,r,x;
cin>>l>>r>>x;
p[l]=p[l]+x;
p[r+1]=p[r+1]-x;
}
for(int i =1;i<=N;i++)
{
d[i]=d[i-1]+p[i];
if(d[i]<0)
printf("0 ");
else
printf("%d ",d[i]);
}
// 请在此输入您的代码
return 0;
}
#include
const int maxn=500005;
long long N[maxn]={0};
long long b[maxn]={0};
using namespace std;
int main()
{
int P,Q;
cin>>P>>Q;
for(int i=1;i<=P;i++){
cin>>N[i];
b[i]=N[i]-N[i-1];//定义差分和数组
}
while(Q>0){
long long l,r,x;
cin>>l>>r>>x;
b[l]+=x;
b[r+1]-=x;//对两端进行操作
Q--;
}
for(int i=1;i<=P;i++){
N[i]=b[i]+N[i-1];//最后回归原来数组
if(N[i]<0){
cout<<0<<" ";
}else
cout<" ";
}
return 0;
}
(1)long long int p[N],d[N];这里没有初始化;你后面的代码中,当i=1时,p[i-1]就是p[0],这是一个未初始化的变量,可能是一个非常大的负数
(2)第一个for循环中,当 i = N时,P[N]越界,对于long long int p[N]来说,下标范围从0到N-1,也就是P[0]到P[N-1],P[N]导致数组越界。
修改方法:
把 ong long int p[N],d[N];这一句改为:
long long int p[N + 2] = { 0 }, d[N + 2] = { 0 }; //增大数组大小,同时把元素初始化未0
参考GPT和自己的思路:
两段代码的主要区别在于差分的处理方式。第一个代码中,差分数组是在输入数据时就计算出来的,因此在修改操作时需要注意边界的处理,同时在输出时也需要进行累加计算。而第二段代码中,先输入原始数组,后面再计算差分,并且在修改操作时直接通过对差分数组进行加减来实现操作。另外,第二段代码中没有使用额外的数组保存差分结果,而是直接对原始数组进行修改,最后再回归到原始数组并输出。可能是因为这些细节方面的不同,导致了测试结果的不一致。建议您仔细分析两段代码的差异,对比调试后再进行修改,以获得正确的结果。
参考GPT和自己的思路:
这两段代码的主要区别在于数组的定义和初始化。
第一个代码中,数组p和d是在运行时动态定义的,并且没有被初始化。在for循环中,数组d的下标从1开始,因此在第一次赋值时会超出数组的范围,导致出错。此外,在循环结束后,数组d的最后一个元素会被多次赋值,因为下标从1开始,而不是从0开始。
第二个代码中,数组N和b是在编译时静态定义的,并且被初始化为0。在for循环开始之前,数组N已经被完全初始化,因此在循环中可以使用下标为1的元素。此外,在for循环结束后,数组N的最后一个元素也只被赋值了一次,因为下标从0开始。
因此,第二个代码更为可靠,也更易于阅读和理解。
这个你输出每一步的中间结果对照下