15 / 24
Sep 2016

Myślę że ten fragment trzeba sprawdzić
"int x1,x2,y1,y2,x3,y3,y4,x4,suma;
cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
suma=pole(x1,y1,x2,y2,x3,y3,x4,y4);
cout< system("PAUSE");"

8 months later

Przechodzi dla każdych moich danych, a i tak jest WA. Ma ktoś jakieś trudne testy?

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int x[5]= {}, y[5]= {}, pier, drug, wspo, a, b;
    cin>>x[1]>>y[1]>>x[2]>>y[2];
    cin>>x[3]>>y[3]>>x[4]>>y[4];
    pier = (x[2]-x[1]) * (y[2]-y[1]);
    drug = (x[4]-x[3]) * (y[4]-y[3]);
    if ((y[1]<y[2]&&y[2]<y[3]&&y[3]<y[4]) || (y[3]<y[4]&&y[4]<y[1]&&y[1]<y[2])) // prostokaty rozlaczone
        b=0;
    else
    {
        sort (y+1, y+5);  // gdy prostokaty zlaczone
        b = y[3]-y[2];
    }
    if ((x[1]<x[2]&&x[2]<x[3]&&x[3]<x[4]) || (x[3]<x[4]&&x[4]<x[1]&&x[1]<x[2]))
        a=0;
    else
    {
        sort (x+1, x+5);
        a = x[3]-x[2];
    }
    wspo = a*b;
    cout << pier+drug-wspo;
    return 0;
}

Pozdrawiam

Dziękuję.
Dalej nie przyjmuje. Widzę że sędzia robi 7 testów. Wszystkie może odrzucać czy wystarczy jeden odrzucony, aby była błędna odpowiedź?

3 months later

Cześć, mam problem. Wydaje mi się, że wszystko jest ok, no ale AC jest nieosiągalne
Z góry dzięki za pomoc :slight_smile:

Wielkie dzięki, tego nie zauważyłem :wink:
Tylko dlaczego autor zadania pisze :"współrzędne odpowiednio lewego-dolnego i prawego-górnego rogu pierwszego prostokąta"?
A i jeszcze jedno pytanie, jaki miał być tam wynik?

Ok, dzięki. Co do programu, to oblicza poprawnie :slight_smile: trzeba było tylko pętlę dodać. A u Ciebie źle policzył, bo dodałeś licznik z przodu

3 years later

Sędzia w tym zadaniu błędnie weryfikuje podesłane kody. Napisałem algorytym i sędzia uznał go jako prawidłowy, a tymczasem sprawdzałem różne przypadki testowe i wiem że mój algorytm zawiera błąd i sędzia go nie wyłapuje.

Czy mam przekleić swój kod ? Autor zadania powienien dodać chyba kilka przypadków testowych.

Podaj kilka przypadków, do których Twój program podaje złe wyniki i oczywiście podaj te wyniki

Dla poniższego zestawu danych:

1 1 5 5 3 1 7 5

prawidłowa odpowiedź powinna wynosić 24 a tymczasem mój algorytm zwraca 16 i sędzia uznaje go jako prawidłowy.

Czy tutaj wkleić mój kod ?

Z kolei inny algorytm wysłany z mojego alternatywnego profilu dla zestawu danych:

1 1 10 10 1 1 15 5

zwraca wynik 81 a powinno być 101 i sędzia również uznaje go jako prawidłowy.

Hmm, mój kod podaje w pierwszym przypadku wynik 24 a w drugim 101.
Pochwal się swoim kodem, tylko najlepiej będzie gdy podasz link do tego kodu na Ideone

Niestety nie posiadam profilu na ideone. Mogę go jedynie wkleić jako zwykły tekst.

Najprawdopodobniej sędzia nie uwzględnia sytuacji gdy współrzędne x jednego prostokąta częściowo pokrywają się z x drugiego prostokąta a y są takie same (pierwszy przypadek) oraz gdy prostokąty częściowo na siebie nachodzą, ale dolne wierzchołki obu prostokątów są takie same (drugi przypadek) .

Założenie profilu na ideone to 3 minuty roboty, ostatecznie podaj go wprost, ale pamiętaj żeby był kompletny i by było zachowane formatowanie ze wszystkimi odstępami i wcięciami. Nikomu nie będzie się chciało czytać niedbale podany kod. Jest tu zresztą opcja na wklejanie kodu. To </>

Ok.
To jest algorytm który podaje 16 zamiast 24 z pierwszego przypadku:

#include<iostream>

using namespace std;

int main() {

    unsigned short xl1, yl1, xr1, yr1, xl2, yl2, xr2, yr2;
    cin >> xl1 >> yl1 >> xr1 >> yr1 >> xl2 >> yl2 >> xr2 >> yr2;
    if (xr1 <= xl2 || xr2 <= xl1 || yr1 <= yl2 || yr2 <= yl1)
        cout << (xr1 - xl1)*(yr1 - yl1) + (xr2 - xl2)*(yr2 - yl2);
    else if ((xr1 < xr2 && yr1 > yr2) || (xr1 > xr2 && yr1 < yr2) || (xl2 < xl1 && yl2 > yl1) || (xl2 > xl1 && yl2 < yl1)) {
        int commx, commy;
        commx = xr1 > xr2 ? xr2 - xl1 : xr1 - xl2;
        commy = yr1 > yr2 ? yr2 - yl1 : yr1 - yl2;
        cout << (xr1 - xl1)*(yr1 - yl1) + (xr2 - xl2)*(yr2 - yl2) - commx * commy;
    }
    else {
        if ((xr1 - xl1)*(yr1 - yl1) > (xr2 - xl2)*(yr2 - yl2)) cout << (xr1 - xl1)*(yr1 - yl1);
        else cout << (xr2 - xl2)*(yr2 - yl2);
    }
    return 0;
}

a to drugi algorytm który podaje 81 zamiast 101:

#include<iostream>

using namespace std;

int main()
{
  unsigned short x1,y1,x2,y2,x3,y3,x4,y4;
  unsigned int area,shx,shy;
  cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
  if (x2<=x3 || x4<=x1 || y2<=y3 || y4<=y1) cout<<(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3);
  else if ((x2<x4 && x1<x3) || (x1>x3 && x2>x4) || (y2<y4 && y1<y3) || (y1>y3 && y2>y4)){
    area=(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3);
    if (x2<x4 && x1<x3) shx=x2-x3;
    else if (x1>x3 && x2>x4) shx= x4-x1;
    else shx=x2-x1;
    if (y2<y4 && y1<y3) shy = y2-y3;
    else if (y1>y3 && y2>y4) shy = y4-y1;
    else shy = y2-y1;
    cout<<area-shx*shy;
  }
  else{
    if ((x2-x1)*(y2-y1)>(x4-x3)*(y4-y3)) cout<<(x2-x1)*(y2-y1);
    else cout<<(x4-x3)*(y4-y3);
  }
  return 0;
}

Dla obu sędzia zwraca AC.

Pozdrawiam

Możliwe, ale z drugiej strony to nie SPOJ, czy sędzia jest błędny tylko po prostu twój kod jest błędny i w pierwszym rzędzie to Ty powinieneś poprawić swój kod. To, że dostajesz mimo tego AC, to faktycznie brak takich tetsów.

Niestety w zasadzie tylko autor mógłby dodać dodatkowe testy, ale możliwe, że już dawno nie jest tu aktywny. Ja ani nie jestem w stanie tego zrobić ani nie jestetm nawet tym specjalnie zaintertesowany. Mój program, podobnie jak @korkirw, daje w obu twoich testach poprawne odpowiedzi.