C ++有毛刺?

时间:2013-12-25 01:02:09

标签: c++

所以我正在研究这个Codeforces problem并编写了一个程序来解决它,但它没有打印正确的答案所以我决定尝试调试它。下面附有代码:

#include <iostream>
using namespace std;

int maxof(int a[], int m)
{
  int x = a[0];
  for (int i = 1; i < m; i++)
    if (x < a[i])
      x = a[i];
  return x;
}

int maxind(int a[], int m)
{
  int x = maxof(a,m);
  int n = 0;
  while (a[n] != x)
    n++;
  return n;
}

...

int maxcost(int a[], int n, int m)
{
  int x = 0;
  for (int i = 0; i < n; i++) {
    /*
    for (int j = 0; j < m; j++)
      cout << a[j] << " ";
    cout << endl;
    */
    x += maxof(a,m);
    a[maxind(a,m)]--;
  }
  return x;
}

...

int main()
{
  int n,m;
  cin >> n >> m;
  int a[m];
  for (int i = 0; i < m; i++)
    cin >> a[i];
  /*
  for (int i = 0; i < m; i++)
    cout << a[i] << " ";
  cout << endl;
  */
  cout << maxcost(a,n,m) << " " << mincost(a,n,m);
}

因此,如果我取出/ * * /块并使用输入

运行程序
4 3
2 1 1

它应该打印出来:

2 1 1
2 1 1
1 1 1
0 1 1
0 0 1
0 0 0
5 5

但它打印出来了:

2 1 1 
2 -3 1 
1 -3 1 
0 -3 1 
0 -3 0 
4 4

这个随机-3来自哪里,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

maxcostmincost

之间,您的案例中未定义评估顺序

maxcost修改a,因此我认为mincost也是如此。

在您的情况下,首先计算mincost,因此maxcost会将修改后的a作为输入。

在致电前或a内克隆maxValueCost(同样适用于minValueCost)。 或确保maxcostmincost不会更改a

答案 1 :(得分:1)

a[maxind(a,m)]--;

你的问题在于这一行。你在代码中减少任何值的唯一地方就在这里。

在这里设置一个断点,你会看到发生了什么。