Czesc, Mam problem z takim zadaniem: https://szkopul.edu.pl/problemset/problem/qvxnxJ6uxu1x9LjRPVyOYtbY/site/?key=statement
Wydaje mi, się że mój pomysł jest dobry, ale się wywala (błędne odpowiedzi) dostaję jedynie 30pkt.
Naliczam sobie na mapie wystapienia(idx-y) danej wartosci i dla kazdej ide sobie gasienica. Tylko nie wiem gdzie jest błąd. Ma ktoś pomysł?
Treść jest trochę dziwnie sformułowana, więc może się upewnie czy ją dobrze zrozumiałem. Mianowicie: szukamy spojnego fragmentu o najwiekszej dlugosci, gdzie mamy maklsymalnie W innych wartosci niż ten kto występuje najwięcej razy.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int n = 0, w = 0, wczytana_liczba = 0, wyn = 0, lewy_wsk = 0, prawy_wsk = 0, w_gasienicy = 0;
unordered_map<int,vector<int>> stat;
inline void przesuwaj_lewy(auto it)
{
w_gasienicy -= it->second[prawy_wsk] - it->second[lewy_wsk] - 1;
lewy_wsk++;
if (lewy_wsk > prawy_wsk)
{
prawy_wsk = lewy_wsk;
w_gasienicy = 0;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> w;
for (int i = 0; i < n; ++i)
{
cin >> wczytana_liczba;
stat[wczytana_liczba].push_back(i);
}
for (auto it = stat.begin(); it != stat.end(); ++it)
{
lewy_wsk = 0;
prawy_wsk = 0;
w_gasienicy = 0;
while(true)
{
wyn = max(wyn,it->second[prawy_wsk] - it->second[lewy_wsk] + 1 + min(w - w_gasienicy,(n-1-it->second[prawy_wsk]) + it->second[lewy_wsk]));
if (lewy_wsk == prawy_wsk && prawy_wsk == it->second.size() - 1)
break;
else if (prawy_wsk == it->second.size() - 1)
przesuwaj_lewy(it);
else if (w_gasienicy + (it->second[prawy_wsk+1] - it->second[prawy_wsk] - 1) <= w)
{
w_gasienicy += (it->second[prawy_wsk+1] - it->second[prawy_wsk] - 1);
prawy_wsk++;
}
else
przesuwaj_lewy(it);
}
}
cout << wyn << '\n';
return 0;
}
Z góry dziękuję za pomoc i poświęcony czas!