Cześć,
W przygotowaniach do OI trafiłem na zadanie Wilcze doły z 3 etapu XXII OI: https://szkopul.edu.pl/problemset/problem/07Q0fFk7fU2TmGr6wpPeDCZj/site/?key=statement
Narazie wymyśliłem pomysł O(n^2 * log n) według ograniczeń powinno być około 30 pkt za to, więc nie najgorzej i pomysł jest taki, że przesuwamy deskę od 1 pozycji do coraz bardziej w prawo potem dla każdej pozycji próbujemy wziaść do dołu 1,2,3.. tyle ile możemy i dla każdego takiego wzięcia robimy binary searcha w prawych i mamy O(n^2 * log n). Jednak mam spory problem z implementacją dostaję złe wyniki w kilku testach (za duże) siedzę nad kodem już dobre 1,5 h. Ma ktoś pomysł gdzie jest błąd?
#include <iostream>
#include <vector>
using namespace std;
long long n = 0, d = 0, wczytana_liczba = 0, wynik = 0, poczatek_zapytanie = 0, koniec_zapytanie = 0;
long long p = 0, ile_mamy_workow;
vector<long long> doly;
vector<long long> sumy_prefiksowe;
long long binary_searchh()
{
if (poczatek_zapytanie >= n)
{
return n-1;
}
long long p = poczatek_zapytanie;
long long k = n;
long long s = 0;
while(k - p != 1)
{
s = (p + k) / 2;
long long suma = sumy_prefiksowe[s] - sumy_prefiksowe[p-1];
if (suma > ile_mamy_workow)
{
k = s;
}
else
{
p = s;
}
}
if (doly[poczatek_zapytanie] > ile_mamy_workow)
{
return poczatek_zapytanie-1;
}
return p;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> p >> d;
if (d >= n)
{
cout << n << "\n";
return 0;
}
for (int i = 0; i < n; ++i)
{
cin >> wczytana_liczba;
doly.push_back(wczytana_liczba);
}
long long s = 0;
for (int i = 0; i < n; ++i)
{
s += doly[i];
sumy_prefiksowe.push_back(s);
}
for (int i = 0; i <= n - d; ++i)
{
ile_mamy_workow = p;
// Najpierw sprawdzamy z nie braniem zadnego z lewej
poczatek_zapytanie = i + d;
//cout << "Wyn: " << binary_searchh() - i + 1 << " Binary Search: " << binary_searchh() << endl;
wynik = max(wynik,binary_searchh() - i + 1);
for (int j = i - 1; j >= 0; --j)
{
long long wyn = 0;
if (ile_mamy_workow - doly[j] >= 0)
{
ile_mamy_workow -= doly[j];
}
else
{
break;
}
poczatek_zapytanie = i + d;
wyn = binary_searchh() - j + 1;
//cout << "Wyn: " << wyn << " Binary Search: " << binary_searchh() << endl;
wynik = max(wynik,wyn);
}
//cout << "I: " << i << " max wynik: " << wynik << endl;
}
cout << wynik << "\n";
return 0;
}
Z góry dziękuję za pomoc!
A i binary search zwraca idx w wektorze wilcze doly.