Zadanie Czwórki

Zadanie Czwórki
jedrzejd
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:25
0

Witam!
Zacząłem robić zadanie http://ki.staszic.waw.pl/task.php?name=czworki
Jednak mój algorytm nie daję AC. Myślę jak to poprawić i nic nie mogę wymyślić.
Da ktoś punkt zaczepienia lub pomysł do tego zadania?
Z góry dziękuję za odpowiedź.

nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:24 dni
  • Postów:1039
0

Bo pewnie zrobiłeś poczwórną pętlę, a to brzmi jak zadanie na programowanie dynamiczne albo sortowanie.

Może to pomoże:
https://en.wikipedia.org/wiki/3SUM
http://www.programcreek.com/2013/02/leetcode-4sum-java/
http://www.geeksforgeeks.org/find-triplets-array-whose-sum-equal-zero/

edytowany 3x, ostatnio: nalik
jedrzejd
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:25
0

Te twoje linki zaczepiają się o temat , ale chyba nie do końca.

nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:24 dni
  • Postów:1039
0
jedrzejd napisał(a):

Te twoje linki zaczepiają się o temat , ale chyba nie do końca.

O matko, Ty chcesz pod nos gotowe rozwiązanie zamiast samemu pomyśleć ... W ten sposób niczego się nie nauczysz.

edytowany 2x, ostatnio: nalik
jedrzejd
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:25
0

dzieki za pomoc

nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:24 dni
  • Postów:1039
0

Możesz spróbować ugryźć to dynamicznie. Te liczby są małe, do 500000. Trzeba by wykorzystać zależność

Kopiuj
SumCnt[i][j] := Sum (SumCnt[i-1][k] * Count( k + x == j ) for each k, x)

gdzie:

  • i to ilość elementów sumy
  • j, k to kolejne możliwe sumy
  • x to elementy zbioru
  • x mozna wybierać bisekcją z posortowanej tablicy (albo idąc na łatwiznę, sprawdzać czy istnieją w std::set)
edytowany 5x, ostatnio: nalik
jedrzejd
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:25
0

Czekaj to ty trzy pętle odpalasz ?

Zobacz pozostały 1 komentarz
nalik
Ile x, k spałnia zależność. To można robić w locie. Lecisz przez k z poprzedniej tablicy i sprawdzasz ile mamy takich x w zbiorze ze zaleznosc bedzie spelniona. To sprowadza sie do sprawdzenia czy istnieje w zbiorze taki x == j -SumCnt[i-1][k]
jedrzejd
trochę pokrętnie napisane wiec SumCnt[i][j] dodaje poprzedni pomnożony o ilość spełniające ten Count( SumCnt[i-1][k] + x == j) warunek?? Dobrze zrozumiałem
nalik
Tak. Chyba, że się rypnąłem :). Bo jeżeli na c sposobów da sie wybrać konkretną dwuelementową sumę, to dla trzyelementowej sumy (dwuelementowej powiększonej o x) musi się dać to zrobić na c * (ilość takich samych x)
jedrzejd
for each k, x iteruje po czym ?
0

W pythonie jest obiekt, który generuje wszystkie kombinacje, itertools.product()
w c++ powinno być coś podobnego, a działanie miej wiecej takie chyba wszystko jest dobrze i to jest raczej łatwe zadanie, a niżeli trudne, poziom gimnazjum.

Kopiuj
import itertools as it

def checkEqual(value):
	amount = 0
	result = False
	size = len(value)
	equal = value[size-1]
	for i in xrange(0, size-1):
		amount += value[i]

	if(amount == equal):
		result = True

	return result

def main():
	value = map(int, raw_input("Enter a numbers: ").split())
	next_perm = it.product(value, repeat=4)
	for i in next_perm:
		if(checkEqual(i)):
			print "{0}+{1}+{2}=={3}".format(i[0], i[1], i[2], i[3])
	

if __name__ == "__main__":
	main()
nalik
I jakim twoim zdaniem to będzie miało złożoność? :) Dokładnie O(n**4). Mistrzu.
jedrzejd
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:25
0
Kopiuj
vector<int> v
do {



}while(next_permutation(v.begin(),v.end()));

Takie coś ?

edytowany 4x, ostatnio: jedrzejd
0
nalik napisał(a):

I jakim twoim zdaniem to będzie miało złożoność? :) Dokładnie O(n**4). Mistrzu.

W sumie, to metoda brute force, jak dobrze zauważyłeś :D

nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:24 dni
  • Postów:1039
0

No niestety. Rozwiązanie dynamiczne przechodzi na 70/100 pkt.

Można zadanie jeszcze bardziej uprościć, jeżeli przepisze się z a + b + c = w na a + b = w - c. Wszytkie a + b <= 500000 i 0 <= w-c <= 500000 da się policzyć w O(n^2). Pozostaje tylko sprawdzić ile z nich spełnia równość. I to już przechodzi na 100/100pkt.

edytowany 2x, ostatnio: nalik
jedrzejd
500000 bi nie ma takiej liczby w tablicy?
nalik
Ale Ciebie interesują tylko te mniejsze od 500 000.
nalik
Bo a + b + c = w <= 500 000 -> a + b = w - c <= 500 000, bo a,b,c,w są dodatnie zawsze. Wyniki większe odrzucasz bo nie mają szans spełnić równości.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.