Buonasera, è da qualche giorno che cerco di risolvere questo problema. Per risolverlo ho pensato di dare a Paola il voto in cui la differenza tra il voto di Monica e Paola è minimo, facendo ciò riesco a risolvere l’input di esempio ma sottoponendo il codice solo appunto l’esempio e il primo case della subtask 4 danno esito positivo, quindi mi chiedevo se l’approccio con cui ho affrontato il problema è sbagliato.
long long solve(int N, int* Ma, int* Pa) {
int contM = 0;
int contP = 0;
vector<int> M(N), P(N), differenze(N);
for (size_t i = 0; i < N; i++)
{
if (Ma[i] > Pa[i])
{
contM++;
}
else
{
contP++;
}
}
long long int risultato = 0;
long long int Monica = 0;
long long int Paola = 0;
if (contM == contP)
{
for (size_t i = 0; i < N; i++)
{
risultato += Ma[i] + Pa[i];
}
}
else
{
if (contM > contP)
{
for (int i = 0; i < N; i++)
{
M[i] = Ma[i];
P[i] = Pa[i];
differenze[i] = M[i] - P[i];
}
while (contM != contP)
{
vector<int>::iterator minIt = min_element(differenze.begin(), differenze.end());
int min = *minIt;
if (min < 0)
{
Paola += P[distance(differenze.begin(), minIt)];
differenze.erase(differenze.begin() + distance(differenze.begin(), minIt));
M.erase(M.begin() + distance(differenze.begin(), minIt));
P.erase(P.begin() + distance(differenze.begin(), minIt));
}
else
{
contP++;
contM--;
Paola += P[distance(differenze.begin(), minIt)];
M.erase(M.begin() + distance(differenze.begin(), minIt));
P.erase(P.begin() + distance(differenze.begin(), minIt));
}
}
for (int i = 0; i < M.size(); i++)
{
Monica += M[i];
}
}
else
{
for (int i = 0; i < N; i++)
{
M[i] = Ma[i];
P[i] = Pa[i];
differenze[i] = P[i] - M[i];
}
while (contM != contP)
{
vector<int>::iterator minIt = min_element(differenze.begin(), differenze.end());
int min = *minIt;
if (min < 0)
{
Monica += M[distance(differenze.begin(), minIt)];
differenze.erase(differenze.begin() + distance(differenze.begin(), minIt));
M.erase(M.begin() + distance(differenze.begin(), minIt));
P.erase(P.begin() + distance(differenze.begin(), minIt));
}
else
{
risultato--;
contP--;
contM++;
Monica += P[distance(differenze.begin(), minIt)];
M.erase(M.begin() + distance(differenze.begin(), minIt));
P.erase(P.begin() + distance(differenze.begin(), minIt));
}
}
for (int i = 0; i < P.size(); i++)
{
Paola += P[i];
}
}
}
risultato += Monica + Paola;
return risultato;
}