Algorytm tablica jednowymiarowa

0

Czy ma ktoś pomysł na ten algorytm?

Dla tablicy jednowymiarowej o rozmiarze n algorytm, wyznacza punkt podziału tablicy na dwie podtablice spełniające własność: suma wartości
elementów w lewej podtablicy (od indeksu 0 do indeksu k ) jest równa sumie wartości elementów prawej podtablicy( tej od indeksu k+1 do n-1). W przypadku istnienia takiego podziału funkcja zwraca punkt podziału (indeks k), w przeciwnym przypadku zwraca –1.

Prosze o pomoc gdyż nie mam pomysłu na ten algorytm.

0
  1. Oblicz sumę wszystkich elementów w tablicy.
  2. Począwszy od 0-ego elementu obliczaj pomniejsze sumy (do k-tego elementu, zwiększając k przy każdym kroku do czasu gdy k <= n-1). W każdym kroku sprawdzaj, czy obecna, pomniejsza suma jest równa sumie wszystkich elementów tablicy - pomniejsza suma. Jeśli jest równa to zwróć index k. Jeśli pętla się skończy zwróć -1.
0

Wiesz nie bardzo rozumiem, Twój sposób.
Z tego co udało mi się wywnioskować to aby algorytm mógł oddać mi szukane k, które spełnia warunki zadania, suma wszystkich elementów musi być parzysta. Początek algorytmu powinien sprawdzić czy suma wszystkich składników jest parzysta, jeżeli nie to powinien oddać -1 jeżeli tak to powinien podzielić tablicę n na dwie poda tablice. I tu zaczyna się mój problem. Nie wiem jak dalej rozgryźć temat.

0
#include <stdio.h>

int f(int *t, const int n, const int sum)
{
	int tmp_s = 0;
	for(int k = 0; k < n; k++)
		if((tmp_s += t[k]) == (sum - tmp_s))
			return k;
	return -1;
}

int main()
{
	const int n = 5;
	int t[] = {1, 1, 1, 1, 2};
	int sum = 0;
	for(int i = 0; i < n; i++)
		sum += t[i];

	printf("%d\n", f(t, n, sum)); 

	return 0;
} 
0
int main()
  {
   const int n = 5;
   int t[] = {1, 1, 1, 1, 2};
   int sum=0,p=0,k=n;
   while(p<k) if(sum<=0) sum+=t[p++]; else sum-=t[--k];
   if(!sum) printf("%d\n",k-1);
   else printf("brak\n");
   return 0;
  }
0

Dalej nie widze rozwiązania jest mi kto w stanie to w prosty sposób wyjaśnić?

0

@CATCH czego nie rozumiesz? Dostałeś tutaj przynajmniej 3 rozwiązania...
Rozwiązanie kolegi @_13th_Dragon jest chyba najbardziej eleganckie i opiera się na prostej zasadzie:

  • lecimy od początku i od końca tablicy aż do chwili kiedy nam się te kawalki "zejdą"
  • kolejne liczby z początku tablicy dodajemy do aktualnej sumy (jeśli spadła poniżej zera) i pamiętamy indeks ostatnio przetworzonej liczby
  • kolejne liczby z końca tablicy odejmujemy od sumy (jeśli jest powyżej zera) i pamiętamy indeks ostatnio przetworzonej liczby
    Jeśli przejdziemy w ten sposób całą tablicę i suma wynosi 0 to znaczy że udało nam się znaleźć punkt podziału i jest nim indeks na którym oba kawałki tablicy się "zeszły".
0

Dzięki wielkie za pomoc

0 użytkowników online, w tym zalogowanych: 0, gości: 0