• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program nie przechodzi wszystkich testów

Mały hosting, OGROMNE możliwości
0 głosów
465 wizyt
pytanie zadane 26 kwietnia 2022 w C i C++ przez Latarnik Użytkownik (650 p.)

Dzień Dobry,

mam pewien kłopot z zadaniem z pierwszej Olimpiady informatycznej Bajtocja. Mam napisany kod jednak ciągle nie przechodzi wszystkich testów i czy ktoś mógłby doradzić pomóc w poprawieniu kodu aby przechodził wszystkie testy??

Bajtocja

Limit pamięci: 32 MB

Za górami, za lasami, za rzekami, za morzami leży kraj potężny i bogaty zwany Bajtocją. Panuje tam dobrotliwy król Bajtazar I Wielki, słynny ze swej troski o infrastrukturę kraju. W Bajtocji znajduje się image miast. Władca rozkazał swym nadwornym architektom przygotować projekty nowych ponaddźwiękowych traktów konnych. Jako odpowiedź otrzymał image propozycji, każda z nich składa się z trzech liczb imageimageimage, gdzie image i image są miastami końcowymi traktu (trakt łączy te miasta bezpośrednio i nie przebiega przez inne miasta), a image oznacza koszt zbudowania tego traktu. Każdym traktem można podróżować zarówno z miasta image do image, jak i w stronę przeciwną. Zamierzeniem króla jest budowa sieci traktów w taki sposób, aby można było nimi przejechać między każdymi dwoma miastami, być może odwiedzając po drodze inne miejscowości. Bajtazar jest bardzo oszczędnym królem, więc postanowił zgodzić się tylko na taką sieć, która będzie możliwie najtańsza.

Zadanie

Opracuj program, który:

  • wczyta ze standardowego liczbę miast, liczbę proponowanych traktów oraz opisy tych traktów,
  • dla każdego traktu określi, czy istnieje taka sieć połączeń między miastami, zgodna z królewskimi rozkazami i w której rozpatrywany trakt, wybudowany za wskazaną kwotę, jest wykorzystywany,
  • wypisze na standardowe wyjście zestawienie uzyskanych wyników.

 

Wejście

Pierwszy wiersz wejścia zawiera dwie liczby całkowite: liczbę miast image i liczbę proponowanych traktów image, rozdzielone pojedynczą spacją i spełniające warunki imageimage. Każdy z kolejnych image wierszy zawiera po trzy liczby całkowite imageimageimage rozdzielone pojedynczymi spacjami, opisujące proponowany trakt, przy czym image i image oznaczają miasta będące końcami traktu, zaś image jest ceną budowy tego traktu (imageimage).

Wyjście

W każdym z kolejnych image wierszy należy wypisać słowo "TAK" albo "NIE", w zależności od tego, czy można skonstruować plan budowy zgodny z życzeniem króla, dla którego trakt opisany w odpowiednim wierszu jest w nim zawarty. Możesz bezpiecznie założyć, że dla danych wejściowych zawsze istnieje plan budowy spełniający wymogi Bajtazara.

Przykład

Dla danych wejściowych:

6 10
1 2 2
1 6 1
1 5 3
4 1 5
2 6 2
2 3 5
4 3 4
3 5 4
4 5 4
5 6 3

poprawną odpowiedzią jest:

TAK
TAK
TAK
NIE
TAK
NIE
TAK
TAK
TAK
TAK

 

#include <iostream>
#include <string> 
#include <algorithm>
#include <vector>

using namespace std;

struct trakty
{
	int p;
	int k;
	int w;
	string pr;
	int kol;
};
bool porownanie(trakty t1,trakty t2)
{
	return t1.w > t2.w;
}
bool porownanie1(trakty t1,trakty t2)
{
	return t1.kol < t2.kol;
}
int main()
{
	int m,n;
	cin>>n>>m;
	trakty t[m];
	int tw = 0;
	int tr = 0;
	unsigned short tb[301] = {};
	int suma = 0;
	string yt[n];
	
	
	for(int r = 0;r<m;r++)
	{
		cin>>t[r].p>>t[r].k>>t[r].w;
		t[r].pr = "TAK";
		t[r].kol = r;
	}	
	sort(t, t +m,porownanie);
	for(int p = m-1;p>=0;p--)
	{
			if(tb[t[m-1].k]==0)
			{ 
				tb[t[m-1].k] ++;
				tb[t[m-1].p] ++;
				suma = suma + 2;
				tw = tw + t[m-1].w;
			} 	
	for(int i = m-1;i>=0;i--)
	{	
	    if(tb[t[i].k] == 0 and tb[t[i].p] ==1)
	    { 
	    	tb[t[i].k] ++;
	 	    suma = suma + 1;
	 	    tw = tw + t[i].w;
	 	if(suma==n)
	    {
	    	tr = t[i].w;
		}
		break;
	    } 	 
		if(tb[t[i].p] == 0 and tb[t[i].k] ==1)
	    { 
	    	tb[t[i].p]++;
	 	    suma = suma + 1;
	 	    tw = tw + t[i].w;
	    if(suma==n)
	    {
	    	tr = t[i].w;
		 }
		 break;
	    } 
	  
    }
    }
	for(int s=0;s<m;s++)
	{
		if(tr <t[s].w)
	        {
		    	t[s].pr = "NIE";	
           }
   }
   sort(t, t +m,porownanie1);
    for(int i = 0;i<m;i++ )
    {
    	cout<<t[i].pr<<endl;
    }
	return 0;
}

 

komentarz 26 kwietnia 2022 przez Whistleroosh Maniak (57,400 p.)
Mógłbyś opisać jak działa Twój algorytm? Bo kod nie jest jakoś bardzo czytelny
komentarz 26 kwietnia 2022 przez adrian17 Mentor (354,880 p.)
Popieram. Jak ktoś pisze kod typu `tb[t[i].p]++;`, to to w zasadzie wygląda jakby nie chciał żeby ktokolwiek mu mógł pomóc :(
komentarz 26 kwietnia 2022 przez Latarnik Użytkownik (650 p.)

@Whistleroosh, Wczytuje w pierwszym for dane do tablicy trakty i wszystkie narazie na prawda  t[i] i potem szukam najszybszej drogi poprzez wczytywanie najtańszych połączeń do tablicy tb[tutaj dodaje 1 jeśli liczby nie ma a druga jest aby oznaczyć że w tym mieście jest już połączenie] kiedy znajdziemy wszystkie to zaznaczamy wszystkie drogi z większą wartością niż ostatni element najkrótszego połączenia jako Fałsz i sortujemy spowrotem na pozycję początkową 

komentarz 26 kwietnia 2022 przez Whistleroosh Maniak (57,400 p.)
edycja 26 kwietnia 2022 przez Whistleroosh

Wciąż nie rozumiem. Czym dokładnie jest tablica tb?

tutaj dodaje 1 jeśli liczby nie ma a druga jest aby oznaczyć że w tym mieście jest już połączenie

jakiej liczby? Poza tym to rozwiązanie na pewno nie jest dobre. Nie możesz robić tego co robisz w pętli w linii 79. Dla każdej krawędzi, warunek czy wynikiem jest dla niej "TAK" albo "NIE", może być inny.

komentarz 26 kwietnia 2022 przez Latarnik Użytkownik (650 p.)
Tablica Tb rejestruje czy ta liczba już była raz użyta i dlatego 1 miasto musi już mieć połączenie i racja w 79 nie dokońca przemyślałem.

Dziękuje za nakierowanie na problem ;)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 10 lipca 2022 w C i C++ przez Latarnik Użytkownik (650 p.)
0 głosów
1 odpowiedź 345 wizyt
0 głosów
0 odpowiedzi 138 wizyt
pytanie zadane 8 lipca 2024 w C i C++ przez Szyszka Gaduła (3,530 p.)

93,718 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,263 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...