clzola
29.6.2011, 17:02
C++
Dat je niz T od N elemenata. Naci maximalan zbir uzastopnih K elemenata.
Input:
U prvom redu se nalaze 2 cijela broja N i K.
U drugom redu se nalazi N cijelih brojeva koje treba ucitati u niz T
Output
U jednom i jedinom redu ispisati maximalan zbir uzastopnih K elemenata.
Ogranicenja:
1 <= N <= 1 000 000, 0 < T[i] <= 1 000
vrijeme: 2 sekunde
memorija: 256MB
Primer:
6 3
10 50 30 20 5 1
-----------------
100
50 + 30 + 20 = 100.
#include <cstdio>
FILE *in;
int maxk(int N, int K, int T[])
{
int prvi;
int zbir = 0;
int max = 0;
int i;
for(i=0; i<K-1; i++)
zbir += T[i];
prvi = 0;
for(i; i<N; i++) {
zbir += T[i];
if(zbir > max) max = zbir;
zbir = zbir - T[prvi];
prvi++;
}
return max;
}
int main()
{
in = fopen("test.txt", "r");
int N;
int K;
int *T;
fscanf(in, "%d %d", &N, &K);
T = new int [N];
for(int i=0; i<N; i++)
fscanf(in, "%d", &T[i]);
printf("%d", maxk(N, K, T));
fclose(in);
return 0;
}
Moj algoritam je slozenosti O(N). Prvo sabere prvih K-1 element i zapamti poziciju prvog elementa. Zatim doda sledeci element, uporedi sa trenutnom max vrijednoscu, a onda od zbira oduzme prvi element, i opet dodaje sledeci element, uporedjuje sa max i sve tako u krug dok ne stigne do kraja...
Postoji li neki algoritam koji radi mnogo brze ... na primer za O(log n);
Dat je niz T od N elemenata. Naci maximalan zbir uzastopnih K elemenata.
Input:
U prvom redu se nalaze 2 cijela broja N i K.
U drugom redu se nalazi N cijelih brojeva koje treba ucitati u niz T
Output
U jednom i jedinom redu ispisati maximalan zbir uzastopnih K elemenata.
Ogranicenja:
1 <= N <= 1 000 000, 0 < T[i] <= 1 000
vrijeme: 2 sekunde
memorija: 256MB
Primer:
6 3
10 50 30 20 5 1
-----------------
100
50 + 30 + 20 = 100.
#include <cstdio>
FILE *in;
int maxk(int N, int K, int T[])
{
int prvi;
int zbir = 0;
int max = 0;
int i;
for(i=0; i<K-1; i++)
zbir += T[i];
prvi = 0;
for(i; i<N; i++) {
zbir += T[i];
if(zbir > max) max = zbir;
zbir = zbir - T[prvi];
prvi++;
}
return max;
}
int main()
{
in = fopen("test.txt", "r");
int N;
int K;
int *T;
fscanf(in, "%d %d", &N, &K);
T = new int [N];
for(int i=0; i<N; i++)
fscanf(in, "%d", &T[i]);
printf("%d", maxk(N, K, T));
fclose(in);
return 0;
}
Moj algoritam je slozenosti O(N). Prvo sabere prvih K-1 element i zapamti poziciju prvog elementa. Zatim doda sledeci element, uporedi sa trenutnom max vrijednoscu, a onda od zbira oduzme prvi element, i opet dodaje sledeci element, uporedjuje sa max i sve tako u krug dok ne stigne do kraja...
Postoji li neki algoritam koji radi mnogo brze ... na primer za O(log n);