zadanie z potyczek algorytmicznych

0

witam nie wiem dlaczego mój program nie rozwiązuje dobrze zadania (rezultatem programu zawsze jest 1 albo 0 co jest niepoprawne) ze strony:
http://main.edu.pl/pl/archive/pa/2012/kre

 
#include <iostream>

using namespace std;

    long int tab[500000][3];
    long int n, wynik, pom1, pom2, pom3;

int main()
{
    wynik = 0;
    cin >> n;

    for (long int i = 0; i < n; i++)
    {
        cin >> tab[i][0] >> tab[i][1] >> tab[i][2];  // wpisanie x,y i r do tab
    }

    for (long int i = 0; i < n; i++)
    {
        for (long int j = i+1; j < n; j++)
        {
            pom1 = (tab[i][0] - tab[j][0])^2;   //obliczam z pitagorasa
            pom2 = (tab[i][1] - tab[j][1])^2;   //a^2+ b^2 = c^2
            pom3 = (tab[i][2] + tab[j][2])^2;   //

            if(pom3 == (pom1 + pom2))
            {
                wynik++;
            }
        }
    }

    cout << wynik;

    return 0;
}

0

^ to nie potęga tylko xor

0

Wciąż nie działa.

Dla danych wejściowych:
4
0 0 5
8 6 5
-6 8 5
2 14 5

powinno wyjść 4 a mój program daje 1

W teście ze strony z zadaniem daje 0/10 pkt i komunikat

Program wywłaszczony

 

#include <iostream>

using namespace std;

    long int tab[500000][3];
    long int n, wynik, pom1, pom2, pom3;

int main()
{
    wynik = 0;
    cin >> n;

    for (long int i = 0; i < n; i++)
    {
        cin >> tab[i][0] >> tab[i][1] >> tab[i][2];  // wpisanie x,y i r do tab
    }

    for (long int i = 0; i < n; i++)
    {
        for (long int j = i+1; j < n; j++)
        {
            pom1 = (tab[i][0] - tab[j][0]) * (tab[i][0] - tab[j][0]);  //z pitagorasa
            pom2 = (tab[i][1] - tab[j][1]) * (tab[i][1] - tab[j][1]);   
            pom3 = (tab[i][2] + tab[j][2]) * (tab[i][2] + tab[j][2]);   

            if(pom3 == (pom1 + pom2))
            {
                wynik++;
            }
        }
    }

    cout << wynik;

    return 0;
}

0

Warunek if(pom3 == (pom1 + pom2)) jest zły bo w zdaniu nie pytają ile jest par kręgów stycznych zewnętrznie, ale ile jest par kręgów, które mają punkt wspólny.
na dodatek (109)2 nie zmieści się w long int (32 bity), ale w long long int (64 bity).

0

MarekR22 zgadza się za mały typ danych trzeba dać long long int.
Ale po zmianie wciąż w teście wychodzi 0/10pkt (3 na 14 testów zaliczyło - 10 testów program wywłaszczony , 1 test zły wynik) i program wywłaszczony.

#include <iostream>

using namespace std;

long int tab[500000][3];
long int n, wynik;
long long int pom1, pom2, pom3;

int main()
{
wynik = 0;
cin >> n;

for (long int i = 0; i < n; i++)
{
    cin >> tab[i][0] >> tab[i][1] >> tab[i][2];  // wpisanie x,y i r do tab
}

for (long int i = 0; i < n; i++)
{
    for (long int j = i+1; j < n; j++)
    {
        pom1 = (tab[i][0] - tab[j][0]) * (tab[i][0] - tab[j][0]);  //z pitagorasa
        pom2 = (tab[i][1] - tab[j][1]) * (tab[i][1] - tab[j][1]);
        pom3 = (tab[i][2] + tab[j][2]) * (tab[i][2] + tab[j][2]);

        if(pom3 == (pom1 + pom2))
        {
            wynik++;
        }
    }
}

cout << wynik;

return 0;

}

0

Nie bez powodu są to "potyczki algorytmiczne" - byle pierwsze lepsze rozwiązanie tutaj nie przejdzie, stąd masz wywłaszczenie programu.

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