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

question-closed SPOJ - BAJTELEK - Absurdalne wartości mn i mx (więcej w opisie i na obrazkach) - C++

0 głosów
70 wizyt
pytanie zadane 7 czerwca w SPOJ przez karolcha100 Nowicjusz (150 p.)
zamknięte 7 czerwca przez karolcha100

Odrazu, na początku zaznaczam że wstawiam cały kod ale nie działającego, nie w pełni zbudowanego programu, gdzie wszystko z góry jest podpisane, sama funkcja nie jest dokończona. Grunt powiedzieć że wydaje mi się że jest to wystarczający mały (i pewnie brzydko napisany) fragment programu by nie podchodził pod regulamin wstawiania problemów ze SPOJ-a. 

Problem z którym tutaj przychodzę to zamiana wartości mx gdy aktywna jest linijka 141 (Pk[i][n[i]]=a[j]*i+b[j];), z poprawnych, na kompletnie arbitralne. Nie wiem w jak sposób ta linijka może na nie wpływać (być może wychodzi ona poza przestrzeń tablicy, nie mam pojęcia) przez co nie wiem także jak to naprawić (poza przebudowaniem programu tak by zniwelować tę linijkę, ale wtedy nie wyniosę z tego żadnej nowej wiedzy jak sobie z czymś takim radzić ;// )

    //Karol Chadzynski
//Tytuł Projektu: Krol Bajtelek
/*

*/

#include <iostream>

using namespace std;
const int MAX=20000;

struct wsp
{
    int x;
    int y;
};


int wczyt1(wsp T[])
{
    int a,b,c=0;
    cin>>a;
    cin>>b;
    for(int j=0;j<MAX;j++)
    {
        cin>>T[j].x;
        cin>>T[j].y;
        c++;
        if(T[j].x==a&&T[j].y==b)
        {
            break;
        }
    }
    return c;
}
/*
void wyp1(int n,wsp T[][MAX],int Pc[],int Ps[])
{
    for(int i=0;i<n;i++)
    {
        cout<<"Dla rysunku["<<i<<"]:\n";
        for(int j=0;j<Pc[i];j++)
        {
            cout<<"["<<j<<"]=("<<T[i][j].x<<";"<<T[i][j].y<<")";
        }
        cout<<"\n";
        for(int j=0;j<Ps[i];j++)
        {
            cout<<"["<<j<<"]=("<<T[i][j].x<<";"<<T[i][j].y<<")";
        }
        cout<<"\n";
    }
}
*/

int minx(int P, wsp T[])
{
    int a;
    a=T[0].x;
    for(int i=0;i<P;i++)
    {
        a>T[i].x ? a=T[i].x : NULL;
    }
    return a;
}

int maxx(int P, wsp T[])
{
    int a;
    a=T[0].x;
    for(int i=0;i<P;i++)
    {
        a<T[i].x ? a=T[i].x : NULL;
    }
    return a;
}

double oblicz(int P, wsp T[])
{
    //wyznaczenie funkcji ax+b
    int a[P];
    int b[P];
    for(int i=0;i<P;i++)
    {
        if(i==0&&(T[i].x-T[P-1].x)!=0)
        {
            a[i]=(T[i].y-T[P-1].y)/(T[i].x-T[P-1].x);
            b[i]=(-((T[P-1].x*(T[i].y-T[P-1].y))/(T[i].x-T[P-1].x))+T[P-1].y);
            //cout<<a[i]<<"*x + "<<b[i]<<"\n";
        }
        else if((T[i].x-T[i-1].x)!=0)
        {
            a[i]=(T[i].y-T[i-1].y)/(T[i].x-T[i-1].x);
            b[i]=(-((T[i-1].x*(T[i].y-T[i-1].y))/(T[i].x-T[i-1].x))+T[i-1].y);
            //cout<<a[i]<<"*x + "<<b[i]<<"\n";
        }
        else
        {
            a[i]=0;
            b[i]=100001;
        }
        cout<<"f(x)="<<a[i]<<" + "<<b[i]<<"\n";
    }
    //znalezienie na osi x max i min
    int Xmin, Xmax;

    Xmin=minx(P,T);
    Xmax=maxx(P,T);


    //wyznaczanie minimum i maximum przedzialow funkcji
    int mn[P],mx[P];
    for(int i=0;i<P;i++)
    {
        if(i==0)
        {
            mn[i]=min(T[i].x,T[P-1].x);
            mx[i]=max(T[i].x,T[P-1].x);
            cout<<i<<" "<<mn[i]<<" "<<mx[i]<<"\n";
        }
        else
        {
            mn[i]=min(T[i].x,T[i-1].x);
            mx[i]=max(T[i].x,T[i-1].x);
            cout<<i<<" "<<mn[i]<<" "<<mx[i]<<"\n";
        }
    }
    //Wyznaczanie wartosci punktow dla funkcji
    double Pk[Xmax-Xmin][P];
    int n[Xmax-Xmin];
    for(int i=Xmin;i<=Xmax;i++)
    {

        n[i]=0;
        for(int j=0;j<P;j++)
        {
            cout<<j<<" "<<mn[j]<<" "<<mx[j]<<"\n";
            if(i>=mn[j]&&i<=mx[j]&&!(a[j]==0&&b[j]==100001))
            {
                n[i]+=1;
                Pk[i][n[i]]=a[j]*i+b[j];
                cout<<"f("<<i<<") = "<<Pk[i][n[i]]<<"\n";

            }
        }
    }

    return 0;
}


int main()
{
    int n;
    cout<<"Podaj liczbe rysunkow: ";
    cin>>n;
    wsp C[n][MAX];
    wsp S[n][MAX];
    int Pc[n],Ps[n]; //Liczba puntkow

    cout<<"Podaj wspolrzedne punktow: ";
    for(int i=0;i<n;i++)
    {
        Pc[i]=wczyt1(C[i]);
        Ps[i]=wczyt1(S[i]);
    }

    //wyp1(n,C,Pc,Ps);
    oblicz(Pc[0],C[0]);
    /*double a;
    for(int i=0;i<n;i++)
    {
        a=oblicz(Pc[i],C[i]);
        cout<<10*a+6*(oblicz(Ps[i],S[i])-a)<<endl;;
    }*/
    return 0;
}


Link do zadania: https://pl.spoj.com/problems/BAJTELEK/

Pozdrawiam i dziękuję za pomoc ;)

komentarz zamknięcia: Znaleziono odpowiedź

1 odpowiedź

+2 głosów
odpowiedź 7 czerwca przez Great Dyskutant (7,860 p.)
wybrane 7 czerwca przez karolcha100
 
Najlepsza
double Pk[Xmax - Xmin + 1][P];
int n[Xmax - Xmin + 1];

Dziwne wartości znajdowały się poza tablicą. 

Spróbuj dokończyć ten program, ale polecam Ci napisać go znacznie prościej. Deklarujesz bardzo wiele tablic (VLA nie jest częścią standardu C++), które w obecnym kodzie zmniejszają czytelność, zajmują mnóstwo pamięci i są zbędne do rozwiązania zadania. Wystarczyłaby jedna tablica, albo bez tablic (jakieś ~30 linii kodu) np.:

#include <iostream>
using long_t = long long;

long_t area() {
    /* ... */
    std::cin >> x0 >> y0;
    /* ... */
    while (std::cin >> x >> y) {
        /* ... */
    }

    return area;
}

int main() {
    int tests;
    std::cin >> tests;

    while (tests--) {
        long_t gray_area = area();
        long_t black_area = area();

        if (black_area > gray_area)
            std::swap(black_area, gray_area);
        std::cout << black_area * 2 + gray_area * 3 << "\n";
    }
}

Podobne pytania

0 głosów
3 odpowiedzi 181 wizyt
pytanie zadane 21 marca 2020 w C i C++ przez lukasz07it Początkujący (290 p.)
0 głosów
2 odpowiedzi 145 wizyt
pytanie zadane 13 maja 2020 w C i C++ przez Stefan Marzec Użytkownik (730 p.)
0 głosów
1 odpowiedź 338 wizyt
pytanie zadane 29 października 2016 w C i C++ przez thekibi27 Bywalec (2,110 p.)

88,677 zapytań

137,289 odpowiedzi

306,652 komentarzy

58,873 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...