为什么这两个程序在 codeforces 上的输出不同,而在 ideone 上却相同?
Why is the output of these 2 programs different on codeforces while they are the same on ideone?
第一个节目:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,taken,i,j,ans=0,t,num,k;
cin>>n>>t;
vector<int>a(n);
for(i=0;i<n;++i)
cin>>a[i];
i=0;j=0;
for(;i<n;++i)
{
if(i>j)
{
j=i;
k=0;
taken=0;
}
for(;j<n;++j)
{
if(taken+a[j]<=t)
{
taken+=a[j];
k++;
}
else
break;
}
ans=max(ans,k);
taken-=a[i];
k--;
}
cout<<ans;
return 0;
}
第二个节目:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,taken,i,j,ans=0,t,num,k;
cin>>n>>t;
vector<int>a(n);
for(i=0;i<n;++i)
cin>>a[i];
for(i=0;i<n;++i)
{
if(i>j)
{
j=i;
k=0;
taken=0;
}
for(j=0;j<n;++j)
{
if(taken+a[j]<=t)
{
taken+=a[j];
k++;
}
else
break;
}
ans=max(ans,k);
taken-=a[i];
k--;
}
cout<<ans;
return 0;
}
似乎这 2 个程序给出了 2 个不同的输出,这里有一个测试用例,您可以自己检查一下:
4 5
3 1 2 1
第一个输出“3”,第二个输出“1991243264
“在 codeforces 测试中,这两个程序在 ideone 上给出了相同的输出。有什么帮助吗?
第二个程序调用了未定义的行为,因为您在外部 for 循环的第一次迭代中读取了 j
的值,而没有先对其进行初始化。这种类型的 UB 的一般结果是读取恰好位于该堆栈位置的任何随机数据......这取决于很多因素,并且可能因环境而异。
这些程序中还有很多其他错误。但纯粹就为什么它给你不同的结果而言....这就是原因。
在第一个程序中,您在 for 循环外设置 i
和 j
的值,然后仅在外部 for 循环的 if 语句内更改 j
。
//...
if(i>j)
{
j=i; //<- set j here
k=0;
taken=0;
}
for(;j<n;++j) //<- using j from above
{
//...
在您的第二段代码中,每次 for 循环为 运行 时,您都将 j
重置为零。在进入第一个 for 循环之前,您也永远不会将 j
设置为一个值,因此当您在 if 语句中使用 j
时,它将调用 undefined behavior.
//...
if(i>j) // j is uninitialized here so you could get anything
{
j=i; //<- set j here
k=0;
taken=0;
}
for(j=0;j<n;++j) //<- set j to zero here
{
//...
在第二个程序中j
未初始化。
for(i=0;i<n;++i)
{
if(i>j)//j is uninitialized here
{
第一个节目:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,taken,i,j,ans=0,t,num,k;
cin>>n>>t;
vector<int>a(n);
for(i=0;i<n;++i)
cin>>a[i];
i=0;j=0;
for(;i<n;++i)
{
if(i>j)
{
j=i;
k=0;
taken=0;
}
for(;j<n;++j)
{
if(taken+a[j]<=t)
{
taken+=a[j];
k++;
}
else
break;
}
ans=max(ans,k);
taken-=a[i];
k--;
}
cout<<ans;
return 0;
}
第二个节目:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,taken,i,j,ans=0,t,num,k;
cin>>n>>t;
vector<int>a(n);
for(i=0;i<n;++i)
cin>>a[i];
for(i=0;i<n;++i)
{
if(i>j)
{
j=i;
k=0;
taken=0;
}
for(j=0;j<n;++j)
{
if(taken+a[j]<=t)
{
taken+=a[j];
k++;
}
else
break;
}
ans=max(ans,k);
taken-=a[i];
k--;
}
cout<<ans;
return 0;
}
似乎这 2 个程序给出了 2 个不同的输出,这里有一个测试用例,您可以自己检查一下: 4 5 3 1 2 1
第一个输出“3”,第二个输出“1991243264 “在 codeforces 测试中,这两个程序在 ideone 上给出了相同的输出。有什么帮助吗?
第二个程序调用了未定义的行为,因为您在外部 for 循环的第一次迭代中读取了 j
的值,而没有先对其进行初始化。这种类型的 UB 的一般结果是读取恰好位于该堆栈位置的任何随机数据......这取决于很多因素,并且可能因环境而异。
这些程序中还有很多其他错误。但纯粹就为什么它给你不同的结果而言....这就是原因。
在第一个程序中,您在 for 循环外设置 i
和 j
的值,然后仅在外部 for 循环的 if 语句内更改 j
。
//...
if(i>j)
{
j=i; //<- set j here
k=0;
taken=0;
}
for(;j<n;++j) //<- using j from above
{
//...
在您的第二段代码中,每次 for 循环为 运行 时,您都将 j
重置为零。在进入第一个 for 循环之前,您也永远不会将 j
设置为一个值,因此当您在 if 语句中使用 j
时,它将调用 undefined behavior.
//...
if(i>j) // j is uninitialized here so you could get anything
{
j=i; //<- set j here
k=0;
taken=0;
}
for(j=0;j<n;++j) //<- set j to zero here
{
//...
在第二个程序中j
未初始化。
for(i=0;i<n;++i)
{
if(i>j)//j is uninitialized here
{