Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <limits.h>
- #include <algorithm>
- #define MAXN 100010
- using namespace std;
- int N;
- int V[MAXN];
- int sums[MAXN];
- int main() {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- scanf("%d", &N);
- for (int i = 0; i < N; i++) {
- scanf("%d", &V[i]);
- }
- /// 1D Range sum - Cerco la posizione in cui abbiamo più benzina
- sums[0] = V[0] - 10;
- int largest_index = -1;
- int largest_val = INT_MIN;
- for (int i = 1; i < N; i++) {
- /// Se la somma precedente è minore non continuo la sequenza ma la ricomincio
- if (sums[i-1] < 0) {
- sums[i] = V[i] - 10;
- }
- /// Altrimenti continuala
- else {
- sums[i] = sums[i-1] + V[i] - 10;
- }
- /// Salvo la posizione col valore maggiore
- if (largest_val < sums[i]) {
- largest_index = i;
- largest_val = sums[i];
- }
- }
- /// Conto anche l'ultimo elemento (l'array è ciclico)
- for (int i = 0; i < N; i++) {
- if (i == 0) {
- sums[i] += sums[N-1];
- }
- else {
- sums[i] = sums[i-1] + (V[i]-10);
- }
- if (largest_val < sums[i]) {
- largest_index = i;
- largest_val = sums[i];
- }
- }
- /// Torno indietro fino all'inizio della sequenza
- int i = largest_index;
- while (1) {
- int previous = i-1;
- if (previous < 0)
- previous = N-1;
- if (sums[previous] <= 0) break;
- i = previous;
- }
- /// +1 perché lavoro con le posizioni 0-based
- printf("%d\n", i+1);
- return 0;
- }
Add Comment
Please, Sign In to add comment