Ciao, ho provato a risolvere questo problema, l’idea risolutiva mi sembra buona ma cisono due tre specifici casi in qui nei test case mi da output errato, quindi suppongo che ci sia un problema nel codice. La mia idea risolutiva era quella di trovare la minima cifra, e confrontare le prime due cifre ed eliminare quella maggiore fino a quando non si arriva alla cifra minima oppure quando si arriva a K, dopo di che ritroviamo la cifra minima e il processo riparte. Una volta raggiunta la fine dell’array di cifre posso semplicemente eliminare i valori maggiori finchè non arrivo a K.
Se qualcuno riesce ad aiutarmi a trovare il bug o il problema, mi farebbe un grande favora Grazie in anticipo.
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <list>
#include <map>
#include <set>
using namespace std;
int main()
{
fstream inputFile("input.txt", ios::in);
fstream outputFile("output.txt", ios::out);
list<uint32_t> digits;
list<uint32_t>::iterator it1;
list<uint32_t>::iterator it2;
uint32_t N, K, v, min;
bool ok = false;
inputFile >> N >> K;
for (size_t i = 0; i < N; i++)
{
inputFile >> v;
digits.push_back(v);
}
it1 = digits.begin();
it2 = ++digits.begin();
min = *min_element(digits.begin(), digits.end());
for (size_t i = 0; i < K; i++)
{
if (ok)
digits.erase(max_element(digits.begin(), digits.end()));
else if (it1 == next(digits.end(), -2) && it2 == --digits.end())
{
if(*it1 > *it2)
digits.erase(it1);
else
digits.erase(it2);
ok = true;
}
else
{
if (*it1 != min)
{
if(*it1 > *it2)
{
digits.erase(it1);
it1 = it2;
it2 = next(it1, 1);
}
else
{
digits.erase(it2);
it2 = next(it1, 1);
}
}
else
{
min = *min_element(++it1, digits.end());
it2 = next(it1, 1);
i--;
}
}
}
for (auto &&i : digits)
{
outputFile << i << ' ';
}
return 0;
}