С ++ имеет глюк?

0

Поэтому я работал над этой проблемой Codeforces, и я написал программу для ее решения, но не печатал правильный ответ, поэтому решил попробовать отладить его. Ниже приведен код:

#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, и как это исправить?

  • 0
    как вы это отладили? с помощью отладчика перешагнуть через код?
  • 2
    Скорее всего, проблема с вашей реализацией, а не сбоем компилятора ...
Показать ещё 7 комментариев
Теги:

2 ответа

6
Лучший ответ

Порядок оценки не определен в вашем случае между maxcost и mincost

maxcost измените a, поэтому я предполагаю, что mincost делает то же самое.

В вашем случае mincost вычисляется mincost, поэтому maxcost получает модифицированный a как вход.

Clone a перед вызовом или внутри maxValueCost (то же самое относится к minValueCost). или убедитесь, что maxcost и mincost не изменяют a.

  • 0
    О, это так? У меня не было идей. Таким образом , я предполагаю , что способ решения этой проблемы , чтобы клонировать a массив?
  • 1
    Вы можете клонировать или найти алгоритм , который не изменить . a a Вы можете использовать std::vector .
Показать ещё 2 комментария
1
a[maxind(a,m)]--;

Ваша проблема заключается в этой линии. Здесь единственное место, где вы уменьшаете значение кода.

Установите здесь точку останова, и вы увидите, что происходит.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню