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
I nic dziwnego, to nie przekątna ma się zmieścić, ale cały prostoąt. Zobacz i poczytaj chociażby komentarze pod zadaniem i dla podanego tam testu twój program też jest błędny. Możesz też poczytać: http://pl.spoj.com/forum-old/viewtopic.php?f=1&t=1098&hilit=6441&sid=89d7aea493b1daeec3ba9aae0c50f1bc358
Chyba załapałeś 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.
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.
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
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
jeżeli nie, to pomożemy
na ideone nie należy używać funkcji system() (na spoj-u jest chyba ignorowana)
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;
}
Zaimplementowane rozwiązanie: 92http://www.jstor.org/stable/2691523?seq=1#page_scan_tab_contents92
Ktoś ma jakiś pomysł co tu może nie działać?
Witam!
Mam pytanie o to jak mógłbym jeszcze przyśpieszyć swój program napisany w javie.
Oto link: http://ideone.com/JgdBFw41
Perzepisać w C/C++ ?
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
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.
#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 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++
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)?
Był już na forum temat poświęcony temu artykułowi. I owszem - są błędne. Chyba nawet ktoś miał wysłać maila w tej sprawie. Więcej info: http://discuss.spoj.com/t/czy-spoj-forum-pomaga-w-pisaniu-dobrych-podpowiedzi/23397/3, ale niestety musisz się przez to przebić.
Co do kompletności a błędu... to trochę jak dowód na to, że liczb pierwszych jest nieskończenie wiele: 2 - pierwsza. 3 - pierwsza. 5 - pierwsza. Więc jest nsk wiele liczb pierwszych. Taki dowód jest niekompletny bo brakuje wielu innych liczb, a zatem jest błędny. Dowody są poprawne albo nie i tyle.
Ok. Dlatego już Cię opierniczam Czym skorupka za młodu nasiąknie, tym na starość trąci
Absolutnie nic. Sam często tak robię.
Pytanie brzmi: czy taki zbiornik jest zawsze potrzebny? W tym przypadku dane można było przetwarzać na bieżąco w pętli. W ten sposób oszczędzasz czas i pamięć.