• 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++

VPS Starter Arubacloud
0 głosów
282 wizyt
pytanie zadane 7 czerwca 2022 w SPOJ przez karolcha100 Nowicjusz (150 p.)
zamknięte 7 czerwca 2022 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 2022 przez Great Stary wyjadacz (12,300 p.)
wybrane 7 czerwca 2022 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 267 wizyt
pytanie zadane 21 marca 2020 w C i C++ przez lukasz07it Początkujący (290 p.)
0 głosów
2 odpowiedzi 207 wizyt
pytanie zadane 13 maja 2020 w C i C++ przez Stefan Marzec Użytkownik (710 p.)
0 głosów
1 odpowiedź 424 wizyt
pytanie zadane 29 października 2016 w C i C++ przez thekibi27 Bywalec (2,110 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...