infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Airinei Adrian din Aprilie 05, 2009, 11:27:24



Titlul: 840 Cuburi3
Scris de: Airinei Adrian din Aprilie 05, 2009, 11:27:24
Aici puteti discuta despre problema Cuburi3 (http://infoarena.ro/problema/cuburi3).


Titlul: Răspuns: 840 Cuburi3
Scris de: Cosmin din Aprilie 05, 2009, 19:48:39
Sal. La probl asta iau eroarea "Killed by signal 11(SIGSEGV)". Din c cauza? Am o coada de 2.000.000 d elemente  cu 2 campuri de tip long si in mod normal dupa calculele mele ar intra...dar coada este subdimensionata...asa ca nu stiu exact cauza: am coada subdimensionata si incerc sa folosesc niste zone d memorie care nu exista sau depasesc memoria? ( mai am si alte variabile sau vectori, dar in total acestea nu depasesc 100000 Kb)


Titlul: Răspuns: 840 Cuburi3
Scris de: chisinau gheorghita din Aprilie 05, 2009, 20:00:42
Ai prea multa memorie 2 * 2 mil = 4 mil....cam mult :P


Titlul: Răspuns: 840 Cuburi3
Scris de: Florian Marcu din Aprilie 08, 2009, 15:50:06
Fac problema cu dinamica in O(n^2), cu memoizare. Iau TLE pe testul 10. Fac cam asa:
Citat
pt fiecare i=1,n , daca !memo[ i ] atunci calc(i).
iar calc(i) arata cam asa:
Citat
int calc(int i)
{
daca (memo[ i ]) return memo[ i ];
pt (j=1;j<=n;++j) daca(j!=i && j se poate pune deasupra lui i) {  x = calc(j); daca(x>max) max = x; }
memo[ i ] = max + l[ i ];
return max;
}

Bineinteles, ca mai am doi vectori, unul care imi retine numarul de turnuri, iar celalalt pentru reconstructia drumului. Este cineva care a luat 100 in acest fel? Ce optimizare as putea face ca sa intre in timp?


Titlul: Răspuns: 840 Cuburi3
Scris de: Marius Stroe din Aprilie 08, 2009, 16:04:48
Fac problema cu dinamica in O(n^2), cu memoizare. Iau TLE pe testul 10. Fac cam asa:

Soluţia cu memoizare nu obţine 100p. Încearcă Varianta 2 (http://infoarena.ro/grigore-moisil-2009/solutii#cuburi3), sau chiar Varianta 3 ;)


Titlul: Răspuns: 840 Cuburi3
Scris de: Florian Marcu din Aprilie 08, 2009, 20:57:31
Ar trebui specificat lucrul asta in articolul cu solutii. Desi prima data mi-a venit in gand ideea de la varianta 2, cand m-am uitat pe articolul cu solutii, am observat ca solutia data in varianta 1 e mult mai usor de implementat... Dar se pare ca nu e optima... :)


Titlul: Răspuns: 840 Cuburi3
Scris de: gaboru corupt din Aprilie 20, 2009, 20:59:53
Am o problema la afisarea indiciilor cuburilor care formeaza turnul. La testele mari imi afiseara cateva cuburi in plus la inceputul fisierului, restul fiind bune.

Cod:
 int k = 0;
    while(sol[poz_max] != 0)
           t[++k] = poz_max;
           poz_max = sol[poz_max];}

poz_max = la inceput e pozitia maximimului turnului
sol[ i ] = inaltimea maxima care are ca ultim element cubul i


Titlul: Răspuns: 840 Cuburi3
Scris de: Florian Marcu din Aprilie 20, 2009, 21:03:21
Nu ar trebui sa ai poz_max = pre[poz_max] (sau cv de genu)? Adica elementul de pe care "s-a venit" in poz_max pt a obtine acel sol[ poz_max ] . La tine sol[] e inaltime, iar poz_max e pozitie. Am inteles eu gresit?


Titlul: Răspuns: 840 Cuburi3
Scris de: gaboru corupt din Aprilie 20, 2009, 21:07:04
Scuze, nu m-am exprima eu bine. sol[ i ] e tatal din care se ajunge in i cum zici tu.  :aha:


Titlul: Răspuns: 840 Cuburi3
Scris de: Alexandru-Iancu Caragicu din Februarie 16, 2011, 18:43:57
Ce legatura are problema asta cu Subsir crescator maximal? (ca acolo se face referire la ea)


Titlul: Răspuns: 840 Cuburi3
Scris de: Simoiu Robert din Februarie 16, 2011, 19:17:41
Citeste solutia oficiala si ai sa vezi legatura.


Titlul: Răspuns: 840 Cuburi3
Scris de: FII Florea Toma Eduard din Martie 07, 2011, 00:43:20
Am o intrebare pentru cei carora li s-a mai intamplat sa ia WA pe ultimele 7 teste....care era bugul? Mentionez ca folosesc varianta a 2-a din solutia oficiala,cea a subsirului crescator maximal de complexitate O(n^2).Multumesc anticipat!

L.E:Never mind....am luat suta  :).


Titlul: Răspuns: 840 Cuburi3
Scris de: UAIC.VlasCatalin din August 26, 2011, 14:10:44
Nu inteleg de ce iau numai primele doua teste, inteleg TLE pe ultimul, dar nu inteleg de ce iau incorect pe celelalte, fac PD O ( n^2 ), si pe exemplele mele merge bine, ma poate ajuta cineva, pls ?  ](*,)


Titlul: Răspuns: 840 Cuburi3
Scris de: George Marcus din August 26, 2011, 14:21:59
Cum sa te ajute lumea? Sa ghiceasca ce ai gresit? Posteaza si tu ceva cod sau descrie-ti solutia.
Ai grija la sortare (cand una dintre dimensiuni e egala cum faci cu cealalta), acelasi lucru si la subsirul crescator.


Titlul: Răspuns: 840 Cuburi3
Scris de: UAIC.VlasCatalin din August 26, 2011, 14:40:10
Uite codul:
code:

begin
 assign(fi,'cuburi3.in');
  assign(fo,'cuburi3.out');
 settextbuf(fi,b1);
  settextbuf(fo,b2);
 reset(fi);
  rewrite(fo);
 readln(fi,n);
 for i:=1 to n do begin
                     readln(fi,a[ i ].l,a[ i ].g);
                     a[ i ].ind:=i;
                     end;
 qsort(1,n); j:=0;
 for i:=1 to n do
  if a[ i ].l=a[i+1].l then inc(j)
   else if j>0 then begin
                    qsort2(i-j,i);
                     j:=0;
                    end;
 b[n].h:=a[n].l; b[n].pos:=n; b[n].nr:=1; b[n].ind:=a[n].ind;
 max2:=b[n].h; posmax2:=n;
 for i:=n-1 downto 1 do begin
                 max:=0; posmax:=i;
                 for j:=i+1 to n do
                  if (a[ j ].g<=a[ i ].g) and (b[ j ].h>max) then begin
                                                              max:=b[j].h;
                                                              posmax:=j;
                                                              end;
                 b[ i ].h:=a[ i ].l+max; b[ i ].pos:=posmax;
                  b[ i ].nr:=b[posmax].nr+1; b[ i ].ind:=a[ i ].ind;
                 if b[ i ].h>max2 then begin
                                  max2:=b[ i ].h;
                                  posmax2:=i;
                                  end;
                 end;
 writeln(fo,b[posmax2].nr,' ',b[posmax2].h);
  j:=posmax2;
 repeat
 writeln(fo,b[j].ind);
 dec(b[posmax2].nr);
  j:=b[j].pos;
 until b[posmax2].nr=0;
close(fo);
end.
Cimpurile tabloului a sunt : l=latura, g=greutatea, ind=numarul de ordine cum apare in sirul initial;
Cimpurile tabloului b sunt : h=inaltimea maxima a turnului la baza caruia se afla elementul i;
pos=pozitia din care s-a format maximul respectiv; nr= cite cuburi formeaza turnul respectiv; ind= pozitia cubului in sirul initial, cam asta. :)
LE: S-a rezolvat, uitasem sa fac ceea ce e insemnat cu rosu, o greseala mica dar care te costa 80 de puncte  :annoyed:


Titlul: Răspuns: 840 Cuburi3
Scris de: George Marcus din August 26, 2011, 15:53:39
Presupun ca ordonezi valorile in ordine descrescatoare. Cred ca ar trebui un posmax:=0; (sau vreo pozitie a vectorului care ia valoarea 0 tot timpul) dupa max:=0; la fiecare iteratie a lui i. Daca nu ma insel, pici astfel de teste:
Cod:
4
1 4
2 5
4 3
6 1
P.S.: Data viitoare cand postezi un cod pune-l intre tagurile [code] [/code]
P.S. 2: In mijlocul unui cuvant se scrie â din a, nu î din i
P.S. 3: Treci la C.

Edit: Aa, exact cand am scris ai corectat :)


Titlul: Răspuns: 840 Cuburi3
Scris de: Mihai Visuian din Noiembrie 29, 2011, 18:39:44
la mine da la testul tau 2 3
                                  2 1
Dar punctajul meu e ca all lui ctlin


Titlul: Răspuns: 840 Cuburi3
Scris de: Mihai Visuian din Noiembrie 29, 2011, 18:44:47
observati ceva in neregula in codul meu?? in afara de ultimul TLE...
Cod:
for ( i = 1; i <= n; i++ )
{
fin >> a[i].l >> a[i].g;
b[i] = a[i];
}
do
{
gata = 1;
for ( i = 1; i < n; i++ )
if ( b[i].g < b[i+1].g )
{
aux = b[i];
b[i] = b[i+1];
b[i+1] = aux;
gata = 0;
}
}
while ( !gata );
maxim[n] = 1;
for ( i = n-1; i >= 1; i-- )
{
maxim[i] = 1;
for ( j = i+1; j <= n; j++ )
if ( b[i].l >= b[j].l && maxim[i] <= maxim[j] )
{
maxim[i] = maxim[j]+1;
poz[i] = j;
}
if ( maxim[i] > max )
{
max = maxim[i];
p = i;
}
}
fout << max << ' ';
i = p;
while ( i != poz[n] )
{
s+=b[i].l;
c[++k] = b[i];
i = poz[i];
}
max = 0;
min = 99999;
for ( i = 1; i <= n; i++ )
{
if ( c[i].g > max )
{
max = c[i].g;
max2 = c[i];
}
else
if ( c[i].g < min && c[i].g != 0 )
{
min = c[i].g;
min2 = c[i];
}
}
fout << s << '\n';
for ( i = 1; i <= n; i++ )
if ( a[i].g == max2.g && a[i].l == max2.l )
fout << i << '\n';
for ( i = 2; i < k; i++ )
for ( j = 1; j <= n; j++ )
if ( a[j].l == c[i].l && a[j].g == c[i].g )
fout << j << '\n';
for ( i = 1; i <= n; i++ )
if ( a[i].g == min2.g && a[i].l == min2.l )
fout << i;
fin.close();
fout.close();
return 0;
}


Titlul: Răspuns: 840 Cuburi3
Scris de: Alexandru-Iancu Caragicu din Ianuarie 23, 2012, 18:56:27
Citeste solutia oficiala si ai sa vezi legatura.
ms


Titlul: Răspuns: 840 Cuburi3
Scris de: Vidrean Mihai din Februarie 29, 2012, 18:43:49
Imi puteti spune de ce iau WA inafara de 2 teste ](*,).Am facut o structura in care am retinut lungimea,greutatea si indicele initial.Am sortat crescator structura dupa latura sau daca e latura egala dupa greutate .Dupa am facut subsir crescator maximal de la capat incoace si dupa reconstitui solutia,pe care o afisez in ordine inversa.
Cod:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct cub{
int l,g,ind;
}v[4001];
bool comp(cub x,cub y){
if(x.l==y.l)
return (x.g<y.g);
else
return (x.l<y.l);
}
vector < int > w;
int best[4001],poz[4001],nr[4001];
int main(){
int n,i,p,j,mx=0;
freopen("cuburi3.in","r",stdin);
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&v[i].l,&v[i].g);
v[i].ind=i;
}
fclose(stdin);
sort(v+1,v+n+1,comp);
freopen("cuburi3.out","w",stdout);
best[n]=v[n].l;
poz[n]=-1;
mx=v[n].l;
p=n;
nr[n]=1;
for(i=n-1;i>=1;i--){
poz[i]=-1;
best[i]=v[i].l;
for(j=i+1;j<=n;j++){
if(v[i].g<v[j].g && best[i]<best[j]+v[i].l){
best[i]=best[j]+v[i].l;
poz[i]=j;
nr[i]=nr[j]+1;
if(best[i]>mx)
mx=best[i],p=i;
}
}
}
printf("%d %d\n",nr[p],mx);
i=p;
while(i!=-1){
w.push_back(v[i].ind);
i=poz[i];
}
for(i=w.size()-1;i>=0;i--)
printf("%d\n",w[i]);
fclose(stdout);
return 0;
}


Titlul: Răspuns: 840 Cuburi3
Scris de: Oncescu Costin din Iunie 22, 2012, 17:39:32
Eu am facut solutia cu AIB dar mai exact am folosit arbori de intervale.
In fine am luat 70,toate variabilele declarate in int.Imi mergeu testele 1,2,3,4,5,6,7;
Apoi am pus toate variabilele declarate in long long.Si imi merg testele 1,2,3,4,5,7,8,pe ultimul TLE;
NU INTELEG DE CE.Teoretic nu ar trebui bagate in long long si oricum nu inteleg de ce dupa o modificare ca astanu imi mai merge testul 6,nu are logica,Mi-am dat o groaza de teste toate imi merg.Ma poate ajuta cineva? ???


Titlul: Răspuns: 840 Cuburi3
Scris de: Pirtoaca George Sebastian din Iunie 22, 2012, 17:48:26
Da, intradevar nu trebuie long long, insa este destul de ciudat ce se intampla. Nu trebuie neaparat sa folosesti AIT , merge si in complexitate patratica foarte repede deoarece n <= 4000. Incearca asa si vedem pa urma ce se intampla.


Titlul: Răspuns: 840 Cuburi3
Scris de: Tudorica Andrei din Ianuarie 17, 2013, 16:22:31
iau 80p cu 2 WA si nu imi dau seama de ce. Vreo idee? :D


Titlul: Răspuns: 840 Cuburi3
Scris de: George Marcus din Ianuarie 17, 2013, 16:24:02
Pot fi si egale dimensiunile (latura sau/si greutatea).


Titlul: Răspuns: 840 Cuburi3
Scris de: Tudorica Andrei din Ianuarie 17, 2013, 17:55:55
Multumesc! :guns:


Titlul: Răspuns: 840 Cuburi3
Scris de: FMI Razvan Birisan din Februarie 03, 2013, 09:09:27
Pentru
Cod:
20
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
1 20
2 19
3 18
4 17
5 16
6 15
7 14
8 13
9 12
19 11
20 10

R:
Cod:
11 74
20
10
9
8
7
6
5
4
3
2
1
?
???


Titlul: Răspuns: 840 Cuburi3
Scris de: Pirtoaca George Sebastian din Februarie 03, 2013, 09:32:08
Da. E corect.


Titlul: Răspuns: 840 Cuburi3
Scris de: FMI Razvan Birisan din Februarie 03, 2013, 09:52:28
Nu înțeleg. ???
Sortez cuburi după greutate și apoi determin cel mai lung subșir descrescător.
Iau 30p cu WA.

Cod:
10
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1

R:
Cod:
1 10
10
?


Titlul: Răspuns: 840 Cuburi3
Scris de: Pirtoaca George Sebastian din Februarie 03, 2013, 09:57:01
Principiul e corect. Incearca rezolvarea in O(N2), fara AIB sau AINT, care ia 100p. Succes!


Titlul: Răspuns: 840 Cuburi3
Scris de: FMI Razvan Birisan din Februarie 03, 2013, 16:05:41
Cel mai mare subșir descrescător cu programare dinamică.
Cod:
void Sdmax()
{
    int Max,t,k;
    ind=0;
    l[N] = 1;
    h=0;
    for( k = N - 1 ; k ; --k )
    {
        Max = 0;
        for( i = k+1 ; i <= N ; ++i )
            if( v[i].l>=v[k].l && Max < l[i] )
                Max = l[i];
        l[k] = Max + 1;
    }
    Max = l[1];
    t = 1;
    for( k = 1 ; k <= N ; ++k )
        if( Max < l[k] )
    {
        Max = l[k];
        t =k;
    }
    kMax = Max;
    rez[++ind] = v[t].p;
    h += v[t].l;
    for( i = t + 1; i <= N ; ++i )
        if( v[i].l >= v[t].l && l[i] == Max - 1 ){
            rez[++ind] = v[i].p;
            h += v[i].l;
            --Max;
        }
}
Sper că la asta te refereai. :-s
Tot 30p. :o


Titlul: Răspuns: 840 Cuburi3
Scris de: George Marcus din Februarie 03, 2013, 16:16:04
Cand faci dinamica, trebuie sa compari atat latura cat si greutatea.


Titlul: Răspuns: 840 Cuburi3
Scris de: Pirtoaca George Sebastian din Februarie 03, 2013, 16:17:44
El sorteaza crescator dupa greutate, deci nu mai e nevoie de a doua comparatie.  :ok:

L.E. Nu imi dau seama ce ar putea fi gresit. Daca nu reusesti sa revolvi pana la urma, da-mi un PM si iti dau sursa mea.


Titlul: Răspuns: 840 Cuburi3
Scris de: George Marcus din Februarie 03, 2013, 16:38:04
Vezi ca tu trebuie sa cauti turnul cu suma laturilor maxima, nu cu numarul maxim de cuburi.


Titlul: Răspuns: 840 Cuburi3
Scris de: Popescu George din Ianuarie 10, 2014, 12:13:37
Imi poate sugera si mie cineva un test (altul fata de cele precizate la comentariile anterioare :D) . Am facut problema dupa varianta 2 de la solutie, dar iau doar 30p..
Cod:
for (i=1;i<=n;++i)
    {
        int Max=0;
        for (j=1;j<i;++j)
            if (a[j].g>=a[i].g)
                if (best[j]>Max) {
                    Max=best[j];
                    poz[i]=j;
                    L[i]=L[j]+1;}
        best[i]=Max+a[i].l;
        if (best[i]>=sum) sum=best[i],p=i,lmax=L[i];;
    }
    printf("%d %d\n",lmax,sum);