- Stavo cercando di risolvere Problema 279-B .
Given an natural number,
t
, and an array,a[0],...,a[n-1]
, of natural numbers, find the maximum length of a continuous subarray,a[i],...,a[j]
ina
wherea[i]+...+a[j] <= t
. e.g. a=[3,1,2,1] and t=5 -> 3(1,2,1) ; a=[2,2,3] and t=3 -> 1 - Ho pensato ad una soluzione O (n 2 ).
Double looping to calculate sums and kind of brute force.
- Ho anche pensato alla somma massima di un sottoarray in un array mediante la programmazione dinamica.
- Ho visto questa soluzione che è O (n lg n )
By creating a sum array defined as:
sum[i]=sum[i−1]+array[i]// for all i>0.
sum[i]=array[i] // for i=0
Then finding j such that (by binary search)
sum[j]−sum[i]//j>i
- Ho visto questa soluzione (1) che è simile a questa soluzione a un altro problema (2) che hanno entrambi la stessa soluzione O (n).
Soluzione 1:
int n; long t; scanf("%d %ld", &n, &t);
long *minutes = new long[n];
long totalTime = 0;
for(int k = 0; k < n; k++){scanf("%ld", minutes + k); totalTime += minutes[k];}
long start(0), finish(0), currentSum(0), output(0);
while(finish < n){
currentSum += minutes[finish++];
while(currentSum > t){currentSum -= minutes[start++];}
if(output < finish - start){output = finish - start;}
}
printf("%ld\n", output);
delete[] minutes;
return 0;
Soluzione 2:
int curr_sum = arr[0], start = 0, i;
for (i = 1; i <= n; i++)
{
// If curr_sum exceeds the sum, then remove the starting elements
while (curr_sum > sum && start < i-1)
{
curr_sum = curr_sum - arr[start];
start++;
}
if (curr_sum == sum)
{
printf ("Sum found between indexes %d and %d", start, i-1);
return 1;
}
if (i < n)
curr_sum = curr_sum + arr[i];
}
printf("No subarray found");
return 0;
Perché funziona l'ultimo approccio (Soluzione 1 per somma inferiore a un numero fisso e soluzione 2 per somma uguale a un numero fisso) Non mi sembra di averlo capito. Non ho potuto trovare la ragione o la prova per questo. Non so se si tratta di un algoritmo denominato.