Guest User

Untitled

a guest
Apr 10th, 2017
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <algorithm>
  4. #define MAXN 100010
  5.  
  6. using namespace std;
  7.  
  8. int N;
  9. int V[MAXN];
  10. int sums[MAXN];
  11.  
  12. int main() {
  13.     freopen("input.txt", "r", stdin);
  14.     freopen("output.txt", "w", stdout);
  15.     scanf("%d", &N);
  16.     for (int i = 0; i < N; i++) {
  17.         scanf("%d", &V[i]);
  18.     }
  19.  
  20.     /// 1D Range sum - Cerco la posizione in cui abbiamo più benzina
  21.     sums[0] = V[0] - 10;
  22.     int largest_index = -1;
  23.     int largest_val = INT_MIN;
  24.     for (int i = 1; i < N; i++) {
  25.         /// Se la somma precedente è minore non continuo la sequenza ma la ricomincio
  26.         if (sums[i-1] < 0) {
  27.             sums[i] = V[i] - 10;
  28.         }
  29.         /// Altrimenti continuala
  30.         else {
  31.             sums[i] = sums[i-1] + V[i] - 10;
  32.         }
  33.         /// Salvo la posizione col valore maggiore
  34.         if (largest_val < sums[i]) {
  35.             largest_index = i;
  36.             largest_val = sums[i];
  37.         }
  38.     }
  39.  
  40.     /// Conto anche l'ultimo elemento (l'array è ciclico)
  41.     for (int i = 0; i < N; i++) {
  42.         if (i == 0) {
  43.             sums[i] += sums[N-1];
  44.         }
  45.         else {
  46.             sums[i] = sums[i-1] + (V[i]-10);
  47.         }
  48.         if (largest_val < sums[i]) {
  49.             largest_index = i;
  50.             largest_val = sums[i];
  51.         }
  52.     }
  53.  
  54.     /// Torno indietro fino all'inizio della sequenza
  55.     int i = largest_index;
  56.     while (1) {
  57.         int previous = i-1;
  58.         if (previous < 0)
  59.             previous = N-1;
  60.  
  61.         if (sums[previous] <= 0) break;
  62.  
  63.         i = previous;
  64.     }
  65.     /// +1 perché lavoro con le posizioni 0-based
  66.     printf("%d\n", i+1);
  67.     return 0;
  68. }
Add Comment
Please, Sign In to add comment