Поэтому я работал над этой проблемой 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, и как это исправить?
Порядок оценки не определен в вашем случае между maxcost
и mincost
maxcost
измените a
, поэтому я предполагаю, что mincost
делает то же самое.
В вашем случае mincost
вычисляется mincost
, поэтому maxcost
получает модифицированный a
как вход.
Clone a
перед вызовом или внутри maxValueCost
(то же самое относится к minValueCost
). или убедитесь, что maxcost
и mincost
не изменяют a
.
a
массив?
a
a
Вы можете использовать std::vector
.
a[maxind(a,m)]--;
Ваша проблема заключается в этой линии. Здесь единственное место, где вы уменьшаете значение кода.
Установите здесь точку останова, и вы увидите, что происходит.