【问题标题】:Why is the output of these 2 programs different on codeforces while they are the same on ideone?为什么这两个程序的输出在 codeforces 上不同,而在 ideone 上却相同?
【发布时间】:2015-07-16 14:09:02
【问题描述】:

第一个程序:

#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 测试上,而 2 个程序在 ideone 上给出相同的输出..有什么帮助吗?

【问题讨论】:

  • 你为什么#include &lt;bits/stdc++.h&gt;?这是谁教的?? :(
  • &lt;bits/stdc++.h&gt;using namespace std; 和一堆早期声明。哎哟。
  • @LightnessRacesinOrbit 这Google result 让我畏缩。而且我认为它来自 CodeForces 也不是巧合。
  • 我在竞争性编程中看到了这种趋势,人们包括bits/stdc++.h,这样他们就不必关心他们是否包含了正确的头文件。我不支持它。
  • 在比赛中节省时间是一种习惯。我现在通常会写这个,即使我不需要包含很多标题来解决特定问题,至于using namespace std 部分.. .当我第一次学习 c++ 时,我是这样学习的,所以这是一种习惯

标签: c++ output


【解决方案1】:

在第一个程序中,您在 for 循环之外设置 ij 的值,然后只在外部 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
{
//...

【讨论】:

【解决方案2】:

第二个程序调用了未定义的行为,因为您在外部 for 循环的第一次迭代中读取了 j 的值,而没有首先对其进行初始化。这种类型的 UB 的一般结果是读取该堆栈位置中发生的任何随机数据......这取决于很多因素,并且可能因环境而异。

这些程序中还有很多其他问题。但纯粹就为什么它会给你不同的结果而言......这就是为什么。

【讨论】:

    【解决方案3】:

    在第二个程序中j 未初始化。

    for(i=0;i<n;++i)
    {
       if(i>j)//j is uninitialized here
        {
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2023-03-22
      相关资源
      最近更新 更多