1 / 61
Oct 2015

Mógłby mi ktoś wytłumaczyć co robię źle w tym zadaniu http://pl.spoj.com/problems/XIWTPZA/145?

#include <cstdio>
int main(){
    unsigned int t,a,b,c,d;
    scanf("%d",&t);
    while(t--)
        {
            scanf("%d %d %d %d",&a,&b,&c,&d);
            if(a>c&&b>d)
                printf("TAK\n");
            else if(a>d&&b>c)
                printf("TAK\n");
            else
                printf("NIE\n");
        }
    return 0;
}

Za wszelką pomoc bardzo dziękuję blush

  • created

    Oct '15
  • last reply

    Aug '19
  • 60

    replies

  • 5.4k

    views

  • 15

    users

  • 15

    likes

  • 15

    links

Frequent Posters

There are 60 replies with an estimated read time of 15 minutes.

A co jeśli prostokąt nr 2 ustawimy pod kątem? np w przypadku kąta 45 stopni zmieści się prostokąt dłuższy od tego w którym jest, o ile będzie odpowiednio "wąski"

Myslalem ze prostokaty sa tak ustawiane aby zajmowac jak najmiej miejsca. Dzieki

Zrobiłem teraz coś takiego

#include <cstdio>
#include <cmath>
int main(){
    unsigned int t,a,b,c,d;
    scanf("%d",&t);
    while(t--)
        {
            scanf("%d %d %d %d",&a,&b,&c,&d);
            if(a>b)
                if(sqrt(c*c+d*d)<b)
                    printf("TAK\n");
                else
                    printf("NIE\n");
            else
                if(sqrt(c*c+d*d)<a)
                    printf("TAK\n");
                else
                    printf("NIE\n");
        }
    return 0;
}

Lecz nadal nie akceptuje rozwiązania expressionless

Nie rozumiem dlaczego 100 50 105 9 jest na TAK
Przecież w takim przypadku nieważne jak ustawimy ten 2 prostokąt to się nie zmieści w tym pierwszym.
Więc dlaczego jest na tak? Tutaj chodzi o pole?
Edit: chyba załapałem. Chodzi o to że może się on schować krótszymi podstawami w rogach tego większego?

Chyba załapałeś wink Możesz zrobić tak. Narysuj na kartce [najlepiej jakiś sztywny papier - karton, lub kratkowany - łatwiej rysować] pierwszy prostokąt i wytnij taką prostokątną dziurę. Tewraz narysuj i wytnij drugi i sprawdź to samodzielnie, czy się zmieści. wink

PS
Możesz to też zrobić w dobrym programie graficznym np geogebra lub zrobić bez wycinania, a tylko z przykładaniem wyciętego do rysunku [obrysu] pierwszego. Ten drugi można [i należy] odpowiednio obracać.

Czy sprawdzilby sie taki sposob?
a- dlugi bok wiekszego prostokata
b- krotki bok wiekszego prostokata
c- dlugi bok miejszego prostokata
d- krotki bok miejszego prostokata

c^2=b'^2+((a/b)*b')^2 //tutaj zostaje do obliczenia tylko b'
c^2=b'^2+a' // tutaj obliczam a'
a-a'=a'' //jeden z bokow malego trojkata ktory powstaje gdy przylozy sie ten miejszy prostokat do wiekszego
b-b'=b'' //  to samo tylko ten 2 bok
c''^2=a''^2+b''^2
if(c''>d) TAK
else NIE

W cpp troszku to inaczej bedzie wygladac ale chodzi o sama zasade dzialania.

3 months later

Witajcie
Niestety nie dziala link do starego forum...
Rozwazajac to zadanie pomyslalem tak: w skrajnym przypadku ustawiania pod katem najdluzszy prostokat jaki da sie zmiescic w wiekszym to jego przekatna (krotszy bok wewnetrznego prostokata -> zero). W takim skrajnym przypadku warunek "zmieszczenia" to twierdzenie pitagorasa. Zatem doszedlem do wniosku, ze warunkiem fizycznego zmieszczenia wewnatrz jest suma kwadratow - a^2 + b^2 > c^2 + d^2.

Zaimplementowalem (JAVA) taki kod:

    import java.io.*;

class Main{

public static void main(String[] args) throws IOException  {
try{
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String linia = input.readLine();

int[] dane = new int[4];

while (input.ready()) {
    String[] liniaSplit = input.readLine().split("[ \t]+");
    for (int j=1; j<=4; j++) {
      dane[j-1]= Integer.parseInt(liniaSplit[j-1]);
      }
    if ((dane[0]*dane[0] + dane[1]*dane[1]) > (dane[2]*dane[2] + dane[3]*dane[3])) 
     {
       System.out.println("TAK");
     }
       else {
               System.out.println("NIE");
            }
}
}

catch(Exception e){
return;
}
}
}

Na roznych danych przetestowany na Ideone.com a SPOJ tego nie lyka...
Czy ktos bylby uprzejmy wskazac mi blad w moim rozumowaniu? Z gory dziekuje.

Pozdrawiam!
Mooreck

7 months later

Witam.
Mam klopot z zadaniem 6441. Mianowicie moj kod dziala w codebloksie jednak po zgloszeniu wyswietla mi sie błąd wykonania (SIGABRT).
Z gory dzieki za pomoc.

#include
#include
#include
using namespace std;
int test;
int a,b,c,d;
double e,f;
int l = new int[test4];

int dluzszy (int x,int y);
int krotki (int x,int y);
double przekatna(double x,double y);
double maleT (double x);
int main()
{
cin >> test;
for (int i=0;i<=(test*4)-1; i++)
{
cin >> l[i];
}
system("cls");

for (int i=0;i<=test-1;i++)
{
a=dluzszy (l[0+(i*4)],l[1+(i*4)]);
b=krotki (l[0+(i*4)],l[1+(i*4)]);
c=dluzszy (l[2+(i*4)],l[3+(i*4)]);
d=krotki (l[2+(i*4)],l[3+(i*4)]);
e=przekatna (l[0+(i*4)],l[1+(i*4)]);
f=maleT(d);
if ((c<e)&&sqrt(pow((a-f),2)+pow((b-2*f),2))>c)
{
    cout << "TAK" << endl;
}
else
{
    cout << "NIE" << endl;
}
}
delete [] l;

return 0;

}
int dluzszy (int x,int y)
{
if (x>=y)
return (x);
else if (y>x)
return (y);
}
int krotki (int x,int y)
{
if (x<=y)
return (x);
else if (y<x)
return (y);
}
double przekatna(double x,double y)
{
return (sqrt(pow(x,2)+pow(x,2)));
}
double maleT (double x)
{
return (x/sqrt(5));
}

program należy przekazywać poprzez link do ideone.com32 - tam także można testować program wstawiając dane w okno danych wejściowych (stdin)

ponieważ program jest całkowicie nieczytelny (zginęły fragmenty, i brak formatowania na skutek niewłaściwego wstawienia kodu), proponuję abyś przeniósł swój kod do ideone, i spróbował uruchomić
może sam zauważysz przy okazji, co jest źle :slight_smile:

jeżeli nie, to pomożemy :slight_smile:

na ideone nie należy używać funkcji system() (na spoj-u jest chyba ignorowana)

1 month later

17http://ideone.com/jhqkJa17 Przechodzi test 100 50 105 9, a mimo to WA.

#include <iostream>
#include <cmath>

void vCzyDrugiMiesciSieWPierwszym(int A, int B, int C, int D)// funkcja sprawdza czy drugi prostokat o podanych bokach miesci sie w pierwszym(nie dotykajac jego bokow) o podanych bokach i wypisuje TAK lub NIE
{
		// ponizsze dwie instrukcje sortuja boki prostokatow w rosnaco
		if(A>B)
		{
			int zmiennaPomocnicza;
			zmiennaPomocnicza=A;
			A=B;
			B=zmiennaPomocnicza;
		}
		if(C>D)
		{
			int zmiennaPomocnicza;
			zmiennaPomocnicza=C;
			C=D;
			D=zmiennaPomocnicza;
		}

	if(C<A && D<B)
		std::cout<<"TAK\n";
	else if( D>B && A>((2*D*C*B+(D*D - C*C)*sqrt(D*D+C*C -B*B))/(D*D +C*C)) )
    	std::cout<<"TAK\n";
	else
		std::cout<<"NIE\n";
}

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

	int A, B, C, D;
	for(int i=1; i<=nLiczbaTestow; i++)
	{
		std::cin>>A>>B>>C>>D;
		vCzyDrugiMiesciSieWPierwszym(A, B, C, D);
	}

	return 0;
}
7 months later

Perzepisać w C/C++ ? :wink:

write.flush(); jest w złym miejscu.

Stosujesz zamianę a z b, ale do tego służy funkcja swap i jest chyba szubsza, od twojej metody?
w skrócie:
swap(a, b)
///// if (a warunek b)
tmp = a
a = b
b = tmp

Na moje oko, masz tam za dużo warunków-sprawdzań i przez to gubisz jeszcze jeden potrzebny. Mimo takich poprawek, już nie TLE, ale WA, więc może zły lub źle użyty wzór?

Co do wzoru, to napisałem już sądzę wystarczająco na ten temat w wątku: http://discuss.spoj.com/t/czy-spoj-forum-pomaga-w-pisaniu-dobrych-podpowiedzi/23397/14

Polecam nie używać wzoru. Siedziałem od wczoraj i zaimplementowanie wszystkich warunków (które nie jest trudno wymyślić) wystarczyło. Natomiast sam wzór (tylko wzór) nie wystarcza.

24 days later

Dobry wieczór,
zmagam się z tym problemem już czwarty dzień z kolei i wyczerpałem wszystkie pomysły co mogło być nie tak. Znalazłem równanie, znalazłem wymagane warunki, wszystko na nic.
Bardzo proszę o wskazówki gdzie popełniam błąd. Dodam, że program przechodzi pozytywnie wszystkie testy. :dizzy_face:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int test;
    cin >>test;
    string answer[test];
    for(int i=0;i<test;i++)
    {
    int a=0,b=0,c=0,d=0,tmp=0;
    cin>>a>>b>>c>>d;
    if (a<b ){tmp=a; a=b; b=tmp;}
    if(c<d){tmp=c;c=d;d=tmp;}
    if (c+d>a+b) answer[i]="NIE";
    else if (c*d>a*b) answer[i]="NIE";
    else if (c*c+d*d>a*a+b*b) answer[i]="NIE";
    else if ((a+b-(a-b))/2<(c+d-(c-d))/2) answer[i]="NIE";
   // else if (a>c&&b>d) answer[i]="TAK";

        else if(    d < b && (c < a || b * (c*c+d*d) > (2*c*d*a + (c*c-d*d)*sqrt(c*c+d*d-a*a)))   ){ answer[i]="TAK";   }
        else answer[i]="NIE";
    }

    for(int i=0;i<test;i++)
    {
    cout<<answer[i]<<endl;
    }

    return 0;
}

Nie podoba mi się, że używasz tablicy. Formatowanie ifów jest wg mnie straszne (nawiasy klamrowe), a jeżeli wykonują one swapy to nie wiem dlaczego nie napisać po prostu swap(a, b). Poza tym jak na mnie to c++ więc czemu math.h a nie cmath?

Nie podobają mi się również Twoje warunki... Według mnie są błędne, choć będąc szczerym nie wczytywałem się. Jak wolisz - moje są zupełnie inne.

Dziękuję za sugestie, faktycznie główny problem tkwił w warunkach, nie pokrywały one całego spectrum możliwości. Jednakże warunki były inspirowane artykułem na dokładnie ten temat, także nie są chyba błędne, a niekompletne :slight_smile: W moim przypadku luka tkwiła w specyficznych warunkach, gdzie jeden prostokąt był wpisany w drugi. Co do formatowania i nieładnej składni - dopiero uczę się C++ :slight_smile:
Z ciekawości - co jest złego w używaniu tablicy jako zbiornika na dane tymczasowe(chcę najpierw przyjąć serie danych, przetworzyć i dopiero wyświetlić wyniki)?