第一个程序:
#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
第一个输出&#34; 3&#34;而第二个输出&#34; 1991243264 &#34;关于codeforces测试,而2个程序在ideone上提供相同的输出。有什么帮助吗?
答案 0 :(得分:1)
在第一个程序中,您在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
{
//...
答案 1 :(得分:0)
第二个程序调用未定义的行为,因为您在外部for循环的第一次迭代中读取j
的值而没有先初始化它。这种类型的UB的一般结果是读取堆栈位置中发生的任何随机数据......这取决于很多因素,并且环境之间可能不同。
这些程序中还有一些其他错误。但纯粹是因为它为什么会给你不同的结果....这就是原因。
答案 2 :(得分:0)
在第二个程序j
未初始化。
for(i=0;i<n;++i)
{
if(i>j)//j is uninitialized here
{