Advertisement
kornelhowil

1A2014

Feb 6th, 2021
902
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.20 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. // Złożoność czasowa O(n)
  4. // Złożoność pamięciowa O(n)
  5.  
  6. int maxdiff(int A[], int n)
  7. {
  8.     int pre[n]; // Tablica sum prefiksowych
  9.     pre[0] = A[0];
  10.     for (int i = 1; i < n; i++)
  11.         pre[i] = A[i] + pre[i-1];
  12.  
  13.     int suf[n]; // Tablica sum sufiksowych
  14.     suf[n - 1] = A[n - 1];
  15.     for (int i = n - 2; i >= 0; i--)
  16.         suf[i] = suf[i + 1] + A[i];
  17.  
  18.     for (int i = 1; i < n; i++) // pre[i] = maksymalna suma od 0 do k <= i
  19.         if (pre[i] < pre[i - 1])
  20.             pre[i] = pre[i - 1];
  21.  
  22.     for (int i = n - 2; i >= 0; i--) // suf[i] = minimalna suma od k do n-1 dla k >= j  
  23.         if (suf[i] > suf[i + 1])
  24.             suf[i] = suf[i + 1];
  25.  
  26.     // w tych nowych tablicach pre i suf chcemy, żeby i = j, bo to jest maksymalna wartość różnicy sum dla danego i, j
  27.     // (pre[i] jest maksymalne, a suf[i] minimalne zatem pre[i] - suf[i] maksymalne)
  28.  
  29.     int max = suf[0] - pre[0];
  30.     for(int i = 0; i < n; i++) // Szukamy maksimum liniowo, bo i tak już jest liniowo to czemu nie
  31.         if (pre[i] - suf[i] > max)
  32.             max = pre[i] - suf[i];
  33.    
  34.     return max;
  35. }
  36.  
  37. int main(void)
  38. {
  39.     int n;
  40.     scanf("%d", &n);
  41.     int A[n];
  42.     for (int i = 0; i < n; i++)
  43.         scanf("%d", &A[i]);
  44.  
  45.     printf("%d\n", maxdiff(A, n));
  46.  
  47.     return 0;
  48. }
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement