Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <iostream> #include <algorithm> #include <cassert> using namespace std; long long min_suma[500007]; long long suma[500007]; int koszt[500007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; //cout<<"dupa\n"; long long s = 0; for (int i = 1; i <= n; i++) { min_suma[i] = 1000000000000000; } for (int i = 1; i <= n; i++) { cin>>suma[i]; suma[i] += suma[i - 1]; if (suma[i] >= 0) { //ten prefiks si� w og�le da wyr�wna� /*koszt[i] = i - 1; //tyle po��cze� trzeba wykona� pesymistycznie for (int j = 0; j < i; j++) { if (suma[j] <= suma[i]) { koszt[i] = min(koszt[i], koszt[j] + (i - j - 1)); } } */ long long* p = lower_bound(min_suma, min_suma + i, suma[i] + 1); //pierwszy wi�kszy ni� suma[i] lub i-ty je�li wszystkie mniejsze // p - tab - 1 = ostatni mniejszy r�wny sumie koszt[i] = (i - 1) - (int)(p - min_suma - 1);; min_suma[i - koszt[i]] = min(min_suma[i - koszt[i]], suma[i]); //cout<<koszt[i]<<" "; } else { koszt[i] = 1000000000; //cout<<"INF "; } /* for (int j = 1; j <= n; j++) { if (min_suma[j] < 1000000000) cout<<min_suma[j]<<" "; else cout<<"INF "; } cout<<endl;*/ } cout<<koszt[n]<<"\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <iostream> #include <algorithm> #include <cassert> using namespace std; long long min_suma[500007]; long long suma[500007]; int koszt[500007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; //cout<<"dupa\n"; long long s = 0; for (int i = 1; i <= n; i++) { min_suma[i] = 1000000000000000; } for (int i = 1; i <= n; i++) { cin>>suma[i]; suma[i] += suma[i - 1]; if (suma[i] >= 0) { //ten prefiks si� w og�le da wyr�wna� /*koszt[i] = i - 1; //tyle po��cze� trzeba wykona� pesymistycznie for (int j = 0; j < i; j++) { if (suma[j] <= suma[i]) { koszt[i] = min(koszt[i], koszt[j] + (i - j - 1)); } } */ long long* p = lower_bound(min_suma, min_suma + i, suma[i] + 1); //pierwszy wi�kszy ni� suma[i] lub i-ty je�li wszystkie mniejsze // p - tab - 1 = ostatni mniejszy r�wny sumie koszt[i] = (i - 1) - (int)(p - min_suma - 1);; min_suma[i - koszt[i]] = min(min_suma[i - koszt[i]], suma[i]); //cout<<koszt[i]<<" "; } else { koszt[i] = 1000000000; //cout<<"INF "; } /* for (int j = 1; j <= n; j++) { if (min_suma[j] < 1000000000) cout<<min_suma[j]<<" "; else cout<<"INF "; } cout<<endl;*/ } cout<<koszt[n]<<"\n"; } |