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

SPOJ Prostokąty

Object Storage Arubacloud
0 głosów
469 wizyt
pytanie zadane 14 czerwca 2019 w C i C++ przez RSG00 Nowicjusz (170 p.)

Mam problem z zadaniem: https://pl.spoj.com/problems/XIWTPZA/ 

#include <iostream>
#include <cmath>
using namespace std;
int t,i,a,b,c,d;
float h;

//Liczy długość przekątnej
float przekatna(int a,int b)
{
    return sqrt(pow(a,2)+pow(b,2));
}

//Oblicza długość, którą maksymalnie może mieć jeden z boków prostokąta, który ma znaleźć się we wnątrz pierwszego prostokąta
float rownanie_kwadratowe(int a, int b, int c, int d, float h)
{
    float delta, x=abs(c*d-a);
    int B=(c*d-a), C=c*h*(2+b);
    delta=pow(B,2)-4*C;
    if(delta==0) return B*(-1)/2;
    else
    if(delta>0)
    {
    if(x>sqrt(delta)) return (B*(-1)-sqrt(delta))/2;
    else return  (B*(-1)+sqrt(delta))/2;
    }
    else return 50001;
}

int main()
{
    cin>>t;
    for(i=0;i<t;i++)
    {
        cin>>a>>b>>c>>d;
        h=przekatna(a,b)/2;
        if(a*b>c*d)
        {
        //sprawdza boki
        if(((a>c)&&(b>d))||((a>d)&&(b>c)))
        cout<<"TAK"<<endl;
        else
        //sprawdza przekątną i bok
        if((przekatna(a,b)>c)&&(rownanie_kwadratowe(a,b,c,d,h)<d))
        cout<<"TAK"<<endl;
        else
        if((przekatna(a,b)>d)&&(rownanie_kwadratowe(a,b,d,c,h)<c))
        cout<<"TAK"<<endl;
        else
        cout<<"NIE"<<endl;
        }
        else
        cout<<"NIE"<<endl;
    }
    return 0;
}

Cały czas mam błąd i nie wiem gdzie. 

2 odpowiedzi

+1 głos
odpowiedź 14 czerwca 2019 przez niezalogowany
IN:
2
3 5 5 1
6 5 9 3
OUT:
TAK
NIE

Pierwszy przypadek: Prostokąt o bokach {5, 1} można zmieścić w prostokącie {3, 5}.

Drugi przypadek: Nie da się, bo nie i kropka :)

0 głosów
odpowiedź 14 czerwca 2019 przez p099 Mądrala (6,390 p.)
Kod ogólnie nie chce działać czy co?, bo u mnie normalnie się kompiluje
komentarz 14 czerwca 2019 przez RSG00 Nowicjusz (170 p.)
W spoju wyświetla komunikat: "Błędna odpowiedź".

Nie wiem, czy jeszcze jeden przypadek ma być, czy mam coś źle w obliczeniach. A już kolejny dzień zastanawiam się nad tym zadaniem nie wiedząc co mam źle.
komentarz 14 czerwca 2019 przez niezalogowany
edycja 15 czerwca 2019

albo lepiej wykasuję bo się moderatorzy obrażą, ale tak z ciekawości po co Ci delta

nie będę się mądrzył bo sprawdziłem odpowiedz i błędna

#include <iostream>
   int main() 
   {  unsigned int A=0,B=0,C=0,D=0,i=0,time;
    std::string ou="";
    std::cin>>time;
    while (i<time) {
       std:: cin>>A>>B>>C>>D;
       if(A>5000||B>5000||C>5000||D>5000)  continue;
       if(A<1||B<1||C<1||D<1)  continue;
        if (A>B)
            std::swap(A,B);
        if (C>D)
            std::swap(C,D);
        if (C<A) {
            if ((C*C+D*D)<(A*A+B*B)) {
                ou+="TAK\n";
                i++; continue;
            }else
            ou+="NIE\n"; i++;continue;
        } else
            ou+="NIE\n"; i++;
    }
    std::cout<<ou;
    return 0;
}

 

komentarz 15 czerwca 2019 przez RSG00 Nowicjusz (170 p.)
Rozważałem na kartce przypadki. Brałem pod uwagę, prostokąt wewnętrzny, który "ustawiłem" wzdłuż przekątnej. Chciałem ustalić jaką może mieć maksymalnie długość bok, który nie będzie równoległy do przekątnej. W taki sposób wyszło mi równanie kwadratowe.
komentarz 15 czerwca 2019 przez niezalogowany
edycja 15 czerwca 2019

ja to policzyłem wszystko na pierwiastkach i sprawdziłem na rysunku to wyniki ok. Ale na spoj limit czasu przekroczony więc nie konieczne dobrze

#include <iostream>
#include <limits>
#include <cmath>

using namespace std;

bool in(int &A)
{
    if (cin>>A&&(!(A>5000||A<1))) return 1;
    cin.clear();
   std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 32);
    return 0;
}
double suma (double x,double y)
{
    return {sqrt(x*x+y*y)};
}
double roznica (double x,double y)
{
    return {sqrt(x*x-y*y)};
}

int main()
{
    int A,B,C,D,a=0;
    double w,z,d;
    bool true1=0, true2=0;
    string ou="";

    cin>>a;
    for (int i=0;i<a;i++){
    while (!(in(A)));
    while (!(in(B)));
    while (!(in(C)));
    while (!(in(D)));
    if (A>B) swap(A,B);
     if (C>D) swap(D,C);
     if(C<A&&D<B) ou+="TAK\n";
     else {
        d=suma((double)C,(double)D);
        w=0.5*(B-roznica(d,(double)A));
        z=0.5*(A-roznica(d,(double)B));
        if(C<(int)suma(w,z)) ou+="TAK\n";
        else ou+="NIE\n";
     }
    }
    cout<<ou;

    return 0;
}

 

komentarz 16 czerwca 2019 przez j23 Mędrzec (194,920 p.)

Po co ta funkcja in? Przecież samo std::cin >> A >> B >> C >> D; wystarczy (dane wejściowe masz jasno zdefiniowane i nie ma potrzeby sprawdzania ich).  

komentarz 16 czerwca 2019 przez niezalogowany
edycja 16 czerwca 2019
Liczby mają być od 1 do 5000, a tak przy okazji przypominam sobie czyszczenie strumienia, bo nie mam zbyt wielu okazji by używać i się zapomina. A jak podejść do spoja, to na poważnie. Trzeba zaczynać od najłatwiejszych i się przyłożyć jak najwięcej rozwiązać. Bo to pewnie jak z niewerbalnymi testami na inteligencję, jakby zacząć od środka, lub od końca to to nie wiele rozwiążesz, a jak od początku to w każdym zadaniu jest jakby klucz do następnego.

A na to zadanie musi być prostsze rozwiązanie, bo to za bardzo matematycznie, a za mało informatycznie to wygląda. Takie odczucie.

Teraz to mi by się przydało jak się odwołać z jednej klasy do drugiej jeżeli są od siebie zależne, chyba nie można stworzyć deklaracji, jak w funkcjach. Tylko chyba zrobić wcześniej szablon i do niego wrzucać typ?
komentarz 17 czerwca 2019 przez j23 Mędrzec (194,920 p.)

Liczby mają być od 1 do 5000

No mają, i dlatego nie musisz sprawdzać, czy dane wejściowe mieszczą się w granicach. Skoro rozwiązanie nie mieści się w limicie czasowym, kod powinieneś zredukować do niezbędnego minimum (a i czytelność się poprawi).

komentarz 17 czerwca 2019 przez niezalogowany
@fisker wydziel sprawdzanie prostokątów do osobnej funkcji. Zamiast dodawać do łańcucha "TAK", lub "NIE" możesz ustawiać zmienną logiczną bool, lub zwracać taką wartość. Jak już uporasz się z problemem limitu czasowego to niewiele zostanie do poprawienia ;)
komentarz 17 czerwca 2019 przez niezalogowany
edycja 23 czerwca 2019

@j23,@Hipco 
Dzięki, ale w tej chwili mam trochę inne limity czasowe. Ważne, bo ze względu na sytuacje zaniedbywane.

Edit Zastosowałem się do wskazówek i przeszło. No i ma mam dylemat, bo myślałem, że nie będę zaglądał na spoja, bo i tak nic nie rozwiąże. Dobrze, że zmarnowałem trochę czasu, to pokusa będzie mniejsza.

Podobne pytania

0 głosów
2 odpowiedzi 842 wizyt
pytanie zadane 8 kwietnia 2019 w SPOJ przez apapis Nowicjusz (160 p.)
0 głosów
1 odpowiedź 885 wizyt
pytanie zadane 21 grudnia 2017 w SPOJ przez niezalogowany
0 głosów
2 odpowiedzi 292 wizyt
pytanie zadane 19 września 2018 w C i C++ przez Krzych0409 Nowicjusz (230 p.)

92,571 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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!

...