Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 29.6.2011, 17:02   #1
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom Maximalni zbir N elemenata u nizu

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.


Spoiler za Kod:

Kod:
#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);
clzola je offline   Odgovor sa citatom ove poruke
Stara 29.6.2011, 17:20   #2
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: Maximalni zbir N elemenata u nizu

Jok. Logaritamsko vreme može da ti se pojavi u problemima u kojima se veličina problema geometrijski smanjuje (recimo, binary search, gde se veličina problema smanjuje dva puta sa svakim upoređivanjem). U ovom slučaju cenim da ne bi postojao efikasniji algoritam, mada možda može nešto dinamičkim programiranjem da se izvuče. Sad žurim, probaću kad se vratim.

EDIT: Mjok, ne uspevam da dobijem manje od O(n).
Kod:
#include <cstdio>
typedef unsigned int uint32;

int main(void)
{
     uint32 sum = 0, n = 0, k = 0, maxSum = 0;
     scanf("%u %u", &n, &k);

     uint32 *nums = new uint32[n];
     for (uint32 i = 0; i < n; ++i)
     {
           scanf("%u", nums + i);
           if (i > k-1)
           {
                   sum += nums[i];
                   sum -= nums[i-k];
           }
           else sum += nums[i];

           if (sum > maxSum) maxSum = sum;
     }
     printf("%u", maxSum);
     return 0;
}
Moguće da ne radi, iz glave sam pisao...
EDIT 2: U je, nisam video da si ti već dao svoj kôd.

Poslednja ispravka: Geomaster (29.6.2011 u 17:35)
Geomaster je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Geomaster na korisnoj poruci:
clzola (29.6.2011)
Stara 30.6.2011, 0:16   #3
pyost
Član
 
Član od: 30.10.2005.
Lokacija: Vancouver, BC
Poruke: 475
Zahvalnice: 48
Zahvaljeno 95 puta na 75 poruka
Određen forumom Re: Maximalni zbir N elemenata u nizu

Može se jednostavno videti da efikasnije nikako ne može od O(n), jer u svakom slučaju moraš proći barem jednom kroz svaki element niza, a to je onda već O(n).
pyost je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 15:16.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com