Zbiory matematyczne i Java

0

Witam serdecznie,

Próbuję rozwiązać zadanie w ramach mojej nauki i nie potrafię wydedukować właściwego rozwiązania.

Cała rzecz polega na tym: należy określić ile osób jednocześnie korzystało z kortu tenisowego.
Mam klasę czas (godziny podaję w formacie wojskowym, czyli gdy to piszę jest 1231)

package pl.test.czas;

import java.util.ArrayList;
import java.util.List;

public class Czas {
	int poczatek;
	int koniec;

	public Czas(int start, int stop) {
		this.poczatek = start;
		this.koniec = stop;
	}

	public static void main(String[] args) {
		List<Czas> godziny = new ArrayList<Czas>() {
			{
				new Czas(1115, 1215);
				new Czas(1110, 1300);
				new Czas(1005, 1200);
				new Czas(1245, 1420);
				new Czas(1130, 1800);


			}
		};
		
		int l = godziny.size();
		
		

	}

	
}

I nie bardzo wiem co dalej... Chciałbym policzyć ile maksymalnie osób jednocześnie korzystało z kortu, czyli sprawdzić nakładające się godziny. Bardzo proszę o pomoc :)

0

Zamień sobie te godziny na jakąś prostą wartość liczbową, której zakresem jest jedna doba. Jeżeli tego nie zrobisz będziesz musiał napisać niestandardową metodę przecinania się jednostki czasu z zakresem czasu. Twoim zadaniem jest policzenie liczby nakładających się odcinków czasu. Najprostsze, ale może mało efektywne rozwiązanie, to iterowanie po atomowych odcinkach czasu doby i sprawdzanie przecięcia się (części wspólnej) tej wartości z wartościami tych odcinków czasu.
Na przykład możesz podzielić dobę na pojedyncze minuty i dla każdej policzyć liczbę zakresów (np. Czas), które tę minutę zawierają. W ten sposób otrzymasz zbiór, o który Ci chodzi z dokładnością do minuty. Dostaniesz wtedy dane z których możesz wyciągnąć wszystkie wartości lokalnych maksimum, a z nich wartość największą. Liczba kortów powinna być od niej nie mniejsza.

0

Jest szybsze rozwiązanie. Dla każdego terminu musisz sprawdzać, czy pomiędzy początkiem, a końcem nie zaczyna się lub nie kończy inny termin. Przykład:
Masz czasy 1000 - 1100 oraz 0900 - 1030. 1030 jest pomiędzy 1000, a 1100, więc zawężasz i sprawdzasz, czy pomiędzy 1000, a 1030 nie ma na korcie jeszcze kogoś. Może wyjść np. że był ktoś jeszcze od 1015 do 1030. Masz już 3 osoby. Zapamiętujesz 3 i jedziesz dalej. Jeśli nastepna iteracja da wynik >3, to podmieniasz 3 na nowy wynik. Trzeba tylko oddzielnie obsłużyć początek innego terminu w sprawdzanym interwale (wtedy sprawdzasz nowy termin od początku tego innego do końca sprawdzanego) lub koniec innego terminu w sprawdzanym (analogicznie).

0
Pafnucy napisał(a):

Cała rzecz polega na tym: należy określić ile osób jednocześnie korzystało z kortu tenisowego.

I nie bardzo wiem co dalej... Chciałbym policzyć ile maksymalnie osób jednocześnie korzystało z kortu, czyli sprawdzić nakładające się godziny. Bardzo proszę o pomoc :)

Ale zasadnicza sprawa: masz znaleźć tylko ile maksymalnie, bez podawania w jakim przedziale czasowym to było, czy masz mieć możliwość podania ile osób gra o podanej godzinie? Pierwsze podejście jest dość proste do zrobienia, drugie wymaga trochę kombinowania z zapamiętywaniem i wyszukiwaniem, ale też można w rozsądny sposób zrobić.
A ty poza napisaniem beana coś wymyśliłeś?

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