[Logo] Mendo Judge Discussion Board - Forums
  [Search] Search   [Recent Topics] Recent Topics   [Hottest Topics] Hottest Topics   [Members]  Member Listing   [Groups] Back to home page 
Messages posted by: MODDI
Forum Index » Profile for MODDI » Messages posted by MODDI
Author Message
Имаш неиницијализирани променливи/вредности (таму во меморија може да има запишано било што). Не можеш да имаш наредба a=max(a, X[i])) а "a" да нема почетна вредност.
Замени "int a, b" со "int a=0, b" на пример и би требало да работи.

Напишав како што ми рековте но повторно истите примери неработат
MOI wrote:
MODDI wrote:Значи кодов знам дека ми паѓа на време но работи во сите случаеви па некоја идеја да го намалам времето или треба некој друг начин. Малку помош?

Па, тој делот со подредувањето (двата вгнездени for циклуси) можеш да ги замениш со sort(A, A+N) и reverse(A, A+N). Тоа е и полесно да се напише.
Понатаму, за zbir и razlika користи нешто како long long наместо int. Вака:

Кодот работи така беше, Благодарам Многу
Значи ја решавам задачава, го испраќам кодот ми враќа грешка во два случаеви го зимам случајот 9 и во CodeBlocks враќа се како што треба а на Мендо повторно дава дека е грешка. Помош!?!
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int X[3],Y[3];
for(int i=0;i<3;i++)
cin>>X[i]>>Y[i];

int pS=0, pA=0;
int a,b;
for(int i=0;i<3;i++)
{
int Xi[3];
int j=0;
int pom=X[i];
a=max(a,X[i]);
while(X[i]>0)
{
Xi[j]=X[i]%10;
X[i]/=10;
j++;
}
int a=Xi[0]+Xi[1]+Xi[2];
if(pom%a==0)
{
pS+=2;
pA-=1;
}
}
for(int i=0;i<3;i++)
{
int Yi[3];
int j=0;
int pom=Y[i];
b=max(b,Y[i]);
while(Y[i]>0)
{
Yi[j]=Y[i]%10;
Y[i]/=10;
j++;
}
int a=Yi[0]+Yi[1]+Yi[2];
if(pom%a==0)
{
pA+=2;
pS-=1;
}
}
if(pS>pA)
{
cout<<pS<<" "<<pA<<endl;
cout<<"Stefan"<<endl;
}
else if(pA>pS)
{
cout<<pS<<" "<<pA<<endl;
cout<<"Ana"<<endl;
}
else
{
cout<<pS<<" "<<pA<<endl;
if(a>b)
cout<<"Stefan"<<endl;
else
cout<<"Ana"<<endl;
}
return 0;
}
Значи кодов знам дека ми паѓа на време но работи во сите случаеви па некоја идеја да го намалам времето или треба некој друг начин. Малку помош?
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin>>N;
int A[N];
for(int i=0;i<N;i++)
cin>>A[i];
for(int i=0;i<N;i++)
{
for(int j=i+1;j<N;j++)
{
if(A[i]<A[j])
{
int pom=A[i];
A[i]=A[j];
A[j]=pom;
}
}
}
int zbir=A[0];
int razlika=A[0];
for(int i=1;i<N;i++)
{
zbir+=A[i];
razlika-=A[i];
}
if(razlika>=0)
cout<<razlika+zbir;
else
cout<<zbir<<endl;
return 0;

}
Ај ако може некој да ми даде идеја како да ја решам задачава, најпрво кога ја погледнав ми текна да ја проверувам цела низа бидејќи може да биде само до 4x5 ама таа може да почне од било кој единица кој е во матрицата и не смее да оди на единица која веќе е помината. Малку помош?
MOI wrote:
MODDI wrote:Значи ја решавав задачава и кодот што го пишав броевите ги правеше во четворки и проверуваше дали последните броеви и првите проеви се според условот X*A=Y*B (XYAB), ама има решенија каде бројот што треба да се брише е во средината во низата, малку помош?


Не сум сигурен што е прашањето, ти треба идеја за решавање на задачата?
Ако да, имај предвид дека N = 100 е всушност мноогу мал број за компјутер, така да можеш да ги испробаш (со 4 for циклуси) сите валидни четворки. (Оваа задача е од тест натпревар со многу учесници и кратко времетраење, па задачите беа направено во однос на поедноставните теми - како во случајов, опсежно пребарување).


Инаку, ако сеуште читаш, постои и поефикасно решение. Имено, A*C=B*D е исто што и A/B=D/C (види како првите два броја во низата се лево од вторите два броја - за едните можеш да тргнеш од лево, за другите од десно). Сега, бидејќи делењето може да доведе до реален број како резултат, треба овие вредности да ги чуваш како дропки, и тоа е тоа. (Ама нема потреба од вакво решение, бидејќи првото функционира, и секогаш треба да го користите наједноставниот пристап)


Да ова решение работи но прашањето ми беше со моето решение некако да се реши задачава, бидејќи како што реков горе може да се случи број што е во средината на низата да се избрише, и после да провериме дали важи условот A*C=B*D од (ABCD).
Значи ја решавав задачава и кодот што го пишав броевите ги правеше во четворки и проверуваше дали последните броеви и првите проеви се според условот X*A=Y*B (XYAB), ама има решенија каде бројот што треба да се брише е во средината во низата, малку помош?
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
int A[N];
for(int i=0;i<N;i++)
{
cin>>A[i];
}
int raz=0;
int a=N-3;
for(int i=0;i<a;i++)
{
if(A[i]*A[i+2]==A[i+1]*A[i+3])
{
raz++;
}
}
int b=A[N-3]*A[N-1];
int c=A[N-2]*A[0];
int d=A[N-1]*A[1];
int e=A[0]*A[2];
if(b==c)
raz++;
if(c==d)
raz++;
if(d==e)
raz++;
cout<<raz<<endl;
return 0;
}
MOI wrote:
MODDI wrote:Ја решавам задачава и сега мојот код вади точно на четири тест примери, на некои ми враќа излезен код различен од 0 и дека некој се грешка ама јас не сфаќам каде ми е грешкава во кодот:

Интересно решение. Твојата грешка е што си играш со функцијата pow(), која всушност работи со реални броеви. Тие се непрецизни, можеш повеќе да прочиташ тука: http://mendo.mk/Lecture.do?id=21

Решението е да тргнеш include <cmath>, и да напишеш нова функција pow()



Ви благодарам, сум заборавил дека pow работи само со реални броеви.
Ја решавам задачава и сега мојот код вади точно на четири тест примери, на некои ми враќа излезен код различен од 0 и дека некој се грешка ама јас не сфаќам каде ми е грешкава во кодот:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long long Z, N=0;
int C,i, A[15];
cin>>Z;
cin>>C;
for(i=0;i<C;i++)
{
N=N+pow(10,i);
}
for(i=0;i<C;i++)
{
A[i]=Z/N;
Z=Z%N;
N=N-pow(10,(C-i-1));
}
for(i=0;i<C;i++)
{
cout<<A[i];
}
return 0;
}
 
Forum Index » Profile for MODDI » Messages posted by MODDI
Go to:   
Powered by JForum 2.1.8 © JForum Team