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

Spoj, zadanie Sort 1

Object Storage Arubacloud
0 głosów
377 wizyt
pytanie zadane 11 września 2020 w SPOJ przez cupoforanges Początkujący (380 p.)
zmienione kategorie 11 września 2020 przez ScriptyChris

Cześć

SPOJ nie przyjmuje kodu twierdząc, że odpowiedź jest błędna

#include <iostream>
#include <math.h>

using namespace std;

void f(double w[],int x[],int y[],string nazwa[], int n)
{
    for(int i=0; i<n; i++)
        for(int j=1; j<n-i; j++) //pętla wewnętrzna
            if(w[j-1]>w[j])
            {
                swap(nazwa[j-1],nazwa[j]);
                swap(x[j-1],x[j]);
                swap(y[j-1],y[j]);
            }
                //zamiana miejscami
                //swap(tab[j-1], tab[j]);
}

int main()
{
    int t;
    int n;

    cin >> t;

    for(int i = 0; i < t; i ++)
    {
        cin >> n;
        int* x = new int[n];
        int* y = new int[n];
        string* nazwa = new string[n];
        double* w = new double[n];//wynik

        for(int j = 0; j < n; j ++)
        {
            cin >> nazwa[j] >> x[j] >> y[j];
            w[j] = sqrt(x[j]*x[j]+y[j]*y[j]);
        }

        f(w,x,y,nazwa,n);

        for(int j = 0; j < n; j++)
        {
            cout << nazwa[j] << x[j] << y[j] << endl;
        }

        cout << endl;

        delete []x;
        delete []y;
        delete []nazwa;
        delete []w;
    }

    return 0;
}

Pomysł mój polegał na tym, żeby wraz z sortowaniem wyniku sqrt(x,y), sortować tak samo nazwę, x i y, dzięki czemu wszystkie te zmienne, które zostały wprwadzone w tym samym czasie były na tych samych indeksach przy wyświetlaniu.

Próbowałem coś kombinować z wyświetlaniem tekstu tj. dodwać endl; lub spację między kolejnymi zmiennymi ale SPOJ nadal nie zalicza.Przejrzałem także bliźniacze wątki, ale nie znalazłem odpowiedzi

Proszę o pomoc.

2 odpowiedzi

+1 głos
odpowiedź 10 stycznia 2023 przez polandonion Mądrala (7,040 p.)

a nie lepiej zrobić jakąś strukturkę i posortować wbudowaną funkcją sort()?

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct Punkt{
	string n;
	int x,y;
	float o;
};
bool f(Punkt p1,Punkt p2){
	return p1.o<p2.o;
}
int main(){
	int t,n,k; cin>>t;
	for(auto i=0; i<t; ++i){
		cin>>n;
		Punkt *p=new Punkt[n];
		for(auto j=0; j<n; ++j){
			cin>>p[j].n>>p[j].x>>p[j].y;
			p[j].o=sqrt(pow(p[j].x,2)+pow(p[j].y,2));
		}
		sort(p,p+n,f);
		for(auto j=0; j<n; ++j){
			cout<<p[j].n<<' '<<p[j].x<<' '<<p[j].y<<'\n';
		}
		delete [] p;
	} 
} 

 

0 głosów
odpowiedź 10 stycznia 2023 przez FabFel Nowicjusz (190 p.)

Cześć,

Wpadłem na taki sam pomysł jak Ty, natomiast nie korzystałem z alokacji dynamicznej tylko po prostu zadeklarowałem tablice:

cin >> n; //liczba punktów
int odl[n];
string punkt[n];

Następnie przekształcałem współrzędne punktów w pętli na stringi i skorzystałem z procedury sortowania bąbelkowego, którego kod można znaleźć na kursie Pana Mirosława i przekształciłem go właśnie tak jak wspomniałeś, czyli indeks nazwy zmieniał się wraz z indeksem wyniku (odległości punktu od środka układu współrzędnych):

void sortowanie_babelkowe_odlipunktu(int *tab, string *pkt, int m) //gdzie m to ilość punktów
{
    for(int i=1; i<m; i++)
    {
        for(int j=m-1; j>=1; j--)
        {
            if(tab[j]<tab[j-1])
            {
                int bufor;
                string bufor2;
                bufor=tab[j-1];
                bufor2=pkt[j-1];
                tab[j-1]=tab[j];
                pkt[j-1]=pkt[j];
                tab[j]=bufor;
                pkt[j]=bufor2;
            }
        }
    }
}

Niemniej jednak, proponowałbym najpierw usunięcie funkcji sqrt(); - pierwiastka, bo to w moim przypadku bruździło, a jest zbędna w tym przypadku. Dodatkowo, jeśli się nie mylę to funkcja swap(); wymaga biblioteki <string>, której u Ciebie brakuje.

Trochę minęło od zadania Twojego pytania, ale może komuś innemu przydadzą się te uwagi :).

Pozdrawiam.

komentarz 10 stycznia 2023 przez Great Stary wyjadacz (12,360 p.)

Niemniej jednak, proponowałbym najpierw usunięcie funkcji sqrt();

To jest słuszna uwaga, ale reszta niezbyt.

Podobne pytania

0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 5 lipca 2023 w SPOJ przez lada_4455 Nowicjusz (170 p.)
0 głosów
1 odpowiedź 146 wizyt
pytanie zadane 19 marca 2023 w SPOJ przez skyynet Początkujący (410 p.)
0 głosów
2 odpowiedzi 458 wizyt

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,003 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...