← Back to topics
Topic

Alien Party Guests

m
matteo123
evo već se jako dugo mučim s ovim zadatkom pa ako mi netko može pomoć.evo koda:

no code
h
halil
Nisam pregledao kod detaljno, ali prvo je sumnjiv treći red 'qsort(r,l)'. Verovatno treba da 'qsort(1,n)', pa ti globalne promenljive r i l neće ni trebati.
Drugo, ako si ih već sortirao (što je ispravan put) u if naredbi ne moraš ispitivati sve uslove; dovoljan je jedan uslov (suma manjih da je veća od najvećeg; x[i] + x[i+1]). Pa još ako tu sumu postaviš pre ' for j:=i to... ' petlje program će raditi još brže. Pa ako posle ne pretažuješ x[j] sekvencijalno, nego binarno, još brže.
Pozdrav.
m
matteo123
e hvala ti.stvarno si car, ali mi možeš pojasnit ono sa qsortom
b
boris4
pa u tvom kodu:

begin
readln (n);
for i:=1 to n do readln (x[i]);
qsort (r,l);

r i l su nedefinisane, verovatno imaju vrednost 0 , ali mozda i neku drugu vrednost.
Ti radis qsort( r, l ), sto je mozda qsort( 0, 0 ) ??
Verovatno si hteo napisati qsort( 1, n ), sortuj ceo niz.
m
matteo123
e hvala vam obojici.sada nemam TLE ali imam WA. ovo je moj sadašnji kod:

no code
h
halil
Ovaj deo nije dobar:

for i:=1 to n do begin
if (x[i]+x[i+1]>x[i+2]) then inc (br)
.....

Prvo. 'for i:= 1 to n-1', inače i+1 biće veće od n.
Zatim, moraš naći najveće j u intervalu [i+1, n], tako da je (x[i]+x[i+1] <= x[j]) i onda je br:= j-i+1.
Dakle, u okviru 'for i:=1 to n-1' petlje treba ti još jedna petlja (verovatno 'while').

m
matteo123
evo napravio sam u c++u ali opet nevalja.evo koda:

no code
h
halil
Ne znam dobro da objasnim, pa pogledaj sledeći kod. Tu je obuhvaćeno sve ono što sam ti napisao u prvom odgovoru.


function DoWork: longint;
var
i,j,mx,z,kl,kd: longint;
begin
if (n < 2) then mx:=n
else begin
mx:=2;
i:=1;
while (i <= n-mx) do begin
z:=x[i] + x[i+1];
kl:=i+1; kd:=n;
while (kl < kd) do begin
j:=(kl+kd+1) shr 1;
if (z > x[j]) then kl:=j
else kd:=j-1;
end;
if (kl-i+1 > mx) then mx:=kl-i+1;
i:= i+1;
end;
end;
DoWork:= mx;
end;

Begin
ReadData;
QSort(1,n);
writeln(DoWork);
End.


Algoritam je taj. Ako kodiraš u C-u dobićeš na brzini (malo). Pozdrav.
b
boris4
Ne moras da koristis binary search...

sortiras

i onda za svako j gledas koliko je max za prvih j.
a to radis tako sto nadjes neko minimalno i za koje a[ i ] + a[ i+1 ] > a[ j ].
za sledece j, mozes samo nastaviti sa prethodnim i jer je niz sortovan, pa je i za sledece j sigurno vece ili jednako prethodnom i.


sort( a, a+n );
int max = 2;
int i = 0;
for (int j = 2;j < N;j++){
while (a[i]+a[i+1] <= a[j]) i++;
if (max < j - i + 1) max = j - i + 1;
}


Nadam se da si razumeo :)
h
halil
Bolja je Borisova ideja. Pozdrav.
A
Al3kSaNdaR
Hvala Borise, ovaj zadatak sam radio u skoli odavno i imao problema sa vremenom. :)
m
matteo123
hvala vam svima.puno ste mi pomogli
m
matteo123
eh znam da vas gnjavim ali opet nešto neradi.sada imam WA na nekima i na zadnjem TLE evo koda:

no code
b
boris4
greska ti je ovde:


for (int i=1;i<=n;++i) {
scanf ("%d",&x[i]);
}


treba da i ide od 0

for (int i=0;i< n;++i) {
scanf ("%d",&x[i]);
}


m
matteo123
evo rješeno. hvala vam svima.super ste