infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Mircea Pasoi din Septembrie 07, 2005, 00:31:06



Titlul: 110 Granita
Scris de: Mircea Pasoi din Septembrie 07, 2005, 00:31:06
Aici puteţi discuta despre problema Granita (http://infoarena.ro/problema/granita).


Titlul: Răspuns: 110 Granita
Scris de: Mihai Leonte din Martie 30, 2007, 19:16:16
Am rezolvat problema asta in O(N*logN) si iese din timp pe 7 teste. Am vzut ca a fost data la .campion 2003 si am cautat-o acolo. Solutia oficiala de acolo e tot O(N*logN)  :-s.

DAR, limita de timp era acolo 0.2 sec. Intr-adevar, in 0.2 sec merge. E o greseala pe site cand s-a pus limita de 0.1? Daca nu, a rezolvat cineva si in O(N)??


Titlul: Răspuns: 110 Granita
Scris de: Dersidan Mihai din Martie 30, 2007, 19:36:29
Rezolvarea este in O(N log N), pentru ca e nevioe de o sortare, si intra in timp.


Titlul: Răspuns: 110 Granita
Scris de: Mihai Leonte din Martie 30, 2007, 20:28:16
Am trimis DOAR citirea si sortarea, ca sa vad daca intra in timp, de curiozitate. Si nu intra nici macar citirea + sortarea. La sortare am folosit quick. Citirea o fac cu fscanf.

(later edit)
Gata, s-a rezolvat. Am inlocuit Quick Sort cu un Heap Sort. Se pare ca totusi exemplele erau bine alese ca sa nu intre Quick in timp. ;)


Titlul: Răspuns: 110 Granita
Scris de: Dersidan Mihai din Martie 31, 2007, 11:22:32
Intra si quick sort in timp, trebuia doar sa il faci random.


Titlul: Răspuns: 110 Granita
Scris de: Rus Cristian din Martie 31, 2007, 12:08:53
daca nu intra quick...incearca merge...


Titlul: Răspuns: 110 Granita
Scris de: Florian Marcu din Mai 01, 2007, 21:05:12
Ei bine...eu iau 80 de puncte cu bubble sort....Am trimis o sursa cu quicksort si luam 0, cu TLE pe toate...Este ciudat cum bubble este mai rapid ca quick..,.[ps: nu inteleg ce e ala quicksort random!  :-k Poate ma poate ajuta cineva, k vreau sa invat si eu, va rog! ] 


Titlul: Răspuns: 110 Granita
Scris de: Stefan Istrate din Mai 01, 2007, 22:49:00
La quicksort-ul normal, pentru un interval [A,B] afli pozitia pe care trebuie sa stea pivotul A astfel incat toate elementele din stanga sunt mai mici, iar toate elementele din dreapta sunt mai mari ca el. La quicksort-ul aleator, in loc de A folosesti ca pivot alt element din intervalul [A,B], pivot pe care il generezi random :thumbup:


Titlul: Răspuns: 110 Granita
Scris de: Cezar Mocan din Septembrie 07, 2007, 11:11:11
Sau se poate sa iti randomizezi un pic valorile inainte de sortare... eu asa am facut si am luat 100.


Titlul: Răspuns: 110 Granita
Scris de: Bondane Cosmin din Septembrie 07, 2007, 11:17:39
Cel mai usor ii cu un set  :-'


Titlul: Răspuns: 110 Granita
Scris de: Rus Cristian din Septembrie 07, 2007, 22:02:13
poate pe tipurile astea de teste...quiksort scoate un timp mai prost...aproape de N^2...incearca merge sort...ala sigur intra


Titlul: Răspuns: 110 Granita
Scris de: Gabriel Bitis din Septembrie 07, 2007, 23:23:47
merge si quicksort.. mie mi'a intrat la problema asta..cel mai mare timp a fost 40ms... deci e destul de bine.


Titlul: Răspuns: 110 Granita
Scris de: Farcasanu Alexandru Ciprian din Februarie 19, 2008, 08:15:42
Salut...am vazut problemele alea cu qsort si asa ca m-am gandit sa va postez o sortare f f buna pe care eu o stiu sub numele de sheel( la aceasta probl cel mai mare timp a fost de 20 ms), fie v vectorul nostru care contine n numere, numerotate de la 1 la n:
Cod:
 
inj=n;
while(inj>1){
inj/=2;
do{
gata=1;
for(i=1;i<=n-inj;i++)
if(v[i]>v[i+inj]){
aux=v[i];
v[i]=v[i+inj];
v[i+inj]=aux;
gata=0;
}
}
while(!gata);
}
sper sa fie de folos cei care nu au facut inca problema
         


Titlul: Răspuns: 110 Granita
Scris de: Andrei Grigorean din Februarie 19, 2008, 08:33:12
Algoritmul postat de tine (shell sort) este destul de ineficient pentru seturi mari de date, insa pentru un numar mai mic de elemente este unul din cei mai rapizi algoritmi cunoscuti. In plus, nu are nevoie de memorie suplimentara.


Titlul: Răspuns: 110 Granita
Scris de: Farcasanu Alexandru Ciprian din Februarie 19, 2008, 08:41:02
Si cam de la cat incep "seturile mari de date?" si pt aceste seturi ce metoda folosesc? qsort?


Titlul: Răspuns: 110 Granita
Scris de: HighScore din Februarie 19, 2008, 13:50:59
Depinde foarte mult si de cum e aranjat sirul initial. Pentru ca exista seturi de date pe care shell sort poate ajunge O(N^2). Pentru mai multe info poti sa cauti pe wikipedia....cred


Titlul: Răspuns: 110 Granita
Scris de: Andrei Grigorean din Februarie 19, 2008, 15:02:24
In general e bine sa folosesti quicksort pentru siruri mai mare de 100-200 de elemente. In C++ poti sa folosesti sort-ul din STL.


Titlul: Răspuns: 110 Granita
Scris de: Pripoae Teodor Anton din Februarie 23, 2008, 14:17:19
In general e bine sa folosesti quicksort pentru siruri mai mare de 100-200 de elemente. In C++ poti sa folosesti sort-ul din STL.

cum faci sort pentru structuri? se poate face?


Titlul: Răspuns: 110 Granita
Scris de: Andrei Grigorean din Februarie 23, 2008, 14:29:17
Da, dar trebuie sa iti faci propria functie de comparare.

Cod:

typedef struct Fractie {
   int a, b;
} Fractie;

inline int cmp(Fractie A, Fractie B) {
    return A.a * B.b < A.b * B.a;
}

int N;
Fractie V[MAXN];

int main() {
    Citeste(V, N);
    sort(V, V+N, cmp);
}


Am schitat codul pentru un program care citeste in vectorul V N fractii pe pozitiile 0... N-1 si le sorteaza crescator.


Titlul: Răspuns: 110 Granita
Scris de: Finaru Andrei Emanuel din Martie 08, 2010, 19:56:16
La problema asta se intampla ceva ciudat: am ok pe primele 3 teste si pe ultimul (care, judecand dupa memorie, e cel mai mare) si pe restul TLE. Cum pot sa ies din timp daca pe cel mai mare test imi intra, nu stiu. Am sortat structura cu mergesort si apoi am verificat cu :
Cod:
for(j=2;j<=n;j++)
{q=1;
while(q<j)
if(a[q].s>a[j].s) {c++; q=j;}
else q++;}
daca dispozitivul e redundant. Daca e un caz poate mai special va rog sa-mi dati un test sa ma prind si eu unde pica. Multumesc anticipat.


Titlul: Răspuns: 110 Granita
Scris de: Florian Marcu din Martie 08, 2010, 21:13:04
Nu e bine cum verifici. Complexitatea ta e patratica. Trebuie un pic mai eficient. Incearca sa renunti la while-ul ala.  :)


Titlul: Răspuns: 110 Granita
Scris de: Finaru Andrei Emanuel din Martie 09, 2010, 11:17:15
Mersi mult! Am luat suta:D:D:D :winner1:


Titlul: Răspuns: 110 Granita
Scris de: Idomir Alin din Aprilie 13, 2010, 23:19:52
Eu am facut quicksort si iau numa 20
Cod:
Cod:
int quick(int st, int dr)
{
     int i,j,piv,aux,aux1;
     i = st; j = dr; piv = a[(st + dr) / 2];
     while (i <= j)
     {
           while (a[ i ] < piv) ++i;
           while (a[ j ] > piv) --j;
          
                 if (i <= j)
                 {
                 aux = a[ i ];  
                 a[ i ] = a[ j ];
                 a[ j ] = aux;
                 aux = b[ i ];
                 b[ i ] = b[ j ];
                 b[ j ] = aux;  
                
                 ++i;--j;}
  }
  if (st < j) quick(st,j);
  if (i < dr) quick(i,dr);
}
Ce as putea imbunatati la quicksortu asta?(daca ma poate ajuta cineva)

 Editat de moderator: Foloseste tagurile [ code ] [ /code ] cand postezi cod.


Titlul: Răspuns: 110 Granita
Scris de: Valentin Harsan din Iunie 21, 2011, 15:06:28
cred ca trebuia sa fie  Aj<=Ai si Bi<=Bj  nu  Aj<Ai si Bi<Bj


Titlul: Răspuns: 110 Granita
Scris de: Andrei C. din Iulie 08, 2011, 15:15:55
Cat trebuie sa de pt:
Cod:
3
1 10
9 12
11 20
Cod:
3
1 11
9 12
11 20


Titlul: Răspuns: 110 Granita
Scris de: Simoiu Robert din Iulie 08, 2011, 22:51:09
Mie-mi da 0 la amandoua.


Titlul: Răspuns: 110 Granita
Scris de: Andrei C. din Iulie 09, 2011, 16:56:15
Multumesc am rezolvat-o deja, intelesesem gresit problema, crezand ca daca un aparat este acoperit de doua aparate atunci el este redundant, dar era ca un aparat este redundant doar daca este acoperit in intregime de un singur alt aparat.


Titlul: Răspuns: 110 Granita
Scris de: UAIC.VlasCatalin din Iulie 10, 2011, 16:36:28
in sfirsit am rezolvat si eu problema pe 100, cind foloseam bublesort obtineam 80 dar totusi insertia este mai rapida si mai eficienta, cu toate ca testul 3 nu stiu din care motive a mers la limita celelalte teste sunt destul de rapide. Pentru cei care inca nu au rezolvat problema recomand insertia pentru a lua 100. :yahoo:


Titlul: Răspuns: 110 Granita
Scris de: Puscas Sergiu din Martie 15, 2012, 20:57:05
O intrebare: cum sortez cu functia qsort() un tablou bidimensional, pe baza compararii unei singure coloane?
Mai exact, daca am matricea a[j], vreau ca prima coloana sa fie sortata crescator, iar asupra celei de-a doua sa se efectueze exact aceleasi interschimbari (daca in matricea a initiala, numerele i si j de pe o anumita linie sunt pereche (sunt pe aceeasi linie), si in matricea finala, sa ramana tot pereche (sa ramana pe aceeasi linie)).


Titlul: Răspuns: 110 Granita
Scris de: Ababab din Martie 15, 2012, 21:04:27
Nu interschimbi, iei un vector separat pe care îl sortezi, dar nu comparând elementele din vector, ci comparând elementele din matricea ta.


Titlul: Răspuns: 110 Granita
Scris de: Puscas Sergiu din Martie 15, 2012, 21:10:40
Si asta cum fac?


Titlul: Răspuns: 110 Granita
Scris de: Mihai Calancea din Martie 15, 2012, 21:19:38
Treci pe STL si e mai simplu.

Cod:
#include<algorithm> // pentru sortare
#include<vector>
#include<iostream>
using namespace std;
int i , n , a , b;
vector< pair<int , int> > v;

int main()
{
for(i = 1; i <= n; ++i) {
cin >> a >> b;
v.push_back(make_pair(a, b));
}

sort(v.begin() , v.end());

return 0;
}

Un element A de tip pair<int , int> este o pereche de doua numere intregi. A.first este primul element, iar A.second este cel de-al doilea. make_pair(a, b) iti returneaza un pair constituit din elementele a si b. Aici ai nevoie de mai multe perechi, deci am declarat un vector <> de pair-uri. Vectorul asta are initial marime 0, iar ca sa adaugi elemente la el folosesti v.push_back(element). In cazul de fata, element este de tip pair.

Sortarea este din biblioteca <algorithm> si sorteaza un vector intre capetele date. Pentru perechi, criteriul de comparare implicit este crescator dupa primul element iar in caz de egalitate dupa al doilea. Daca doresti un alt criteriu, poti da ca al treilea parametru o functie de comparare.

Mai multe detalii gasesti pe
http://cplusplus.com/reference/stl/vector/
http://cplusplus.com/reference/algorithm/sort/

Iti recomand sa inveti STL  :) Codul poate deveni foarte elegant si scurt daca il folosesti cum trebuie.


Titlul: Răspuns: 110 Granita
Scris de: Puscas Sergiu din Martie 17, 2012, 00:29:48
Multumesc, cu metoda asta am reusit sa iau suta


Titlul: Răspuns: 110 Granita
Scris de: Guianu Leon din Octombrie 16, 2012, 16:57:17
Cum poti face verificarea intr-un timp mai mic de N^2 ? :(


Titlul: Răspuns: 110 Granita
Scris de: Pirtoaca George Sebastian din Octombrie 16, 2012, 17:11:43
Poti rezolva mai intai problema http://infoarena.ro/problema/linterv (daca nu stii cum , are solutie oficiala). Succes!


Titlul: Răspuns: 110 Granita
Scris de: Guianu Leon din Octombrie 16, 2012, 20:08:59
Poti rezolva mai intai problema http://infoarena.ro/problema/linterv (daca nu stii cum , are solutie oficiala). Succes!

Desteapta sugestia! Am reusit sa le fac pe amandoua de 100! Traiasca familia ta!  :yahoo:


Titlul: Răspuns: 110 Granita
Scris de: Adrian Budau din Noiembrie 25, 2012, 18:57:05
Pe linux in versiunea noastra de GCC nu acolo se gaseste INT_MAX. E de preferat sa folosesti numeric_limits<int>::max() in loc. (Incluzi limits(fara .h)).

Si Visual Studio nu e tocmai un argument ca merge. El nu prea respecta toate regulile legate de C++. De exemplu tu in clasa definesti operatorul cu paramtrii const(const Boundary &a, const Boundary &b) ... etc,  dar implementezi in exterior fara const. Modifica in ambele locuri sa ai la fel.

L.E:
Vezi ca inline in interiorul unei clase nu face nimic. Orice functie pe care o implementezi dupa class ... { si inainte sa inchizi acolada se defineste inline. Daca o implementezi in exterior(cum faci tu) trebuie sa o dai ca inline acolo unde o implementezi.

L.L.E: @jumper007 De ce iti stergi posturile? Poate lumea invata ceva din intrebarile pe care le pui mai tarziu cand se uita


Titlul: Răspuns: 110 Granita
Scris de: Vlad Negura din Ianuarie 10, 2013, 01:39:00
nush cum la voi la mine cu quicksort a mers pe maxim 12ms  8)
Citat
struct dvc{long a,b;};

void qsort(long l,long r){
    long i=l,j=r,p=t[(l+r)/2].a; dvc aux;
    while (i<j){
        while (t.a<p) i++;
        while (t[j].a>p) j--;
        if (i<=j) aux=t, t=t[j], t[j]=aux, i++, j--;
    }
    if (j>l) qsort(l,j);
    if (i<r) qsort(i,r);
}


Titlul: Răspuns: 110 Granita
Scris de: David Bogdan din Martie 14, 2015, 10:52:01
ce inseamna Killed by signal 11(SIGSEGV)


Titlul: Răspuns: 110 Granita
Scris de: David Bogdan din Martie 14, 2015, 10:52:35
ce inseamna Killed by signal 11(SIGSEGV)


Titlul: Răspuns: 110 Granita
Scris de: Robert Badea din Martie 14, 2015, 12:56:23
SIGSEGV este un semnal pe care, de obicei, sistemele tip unix la trimit proceselor care comit segmentation facult, sau mai exact access violation. Acest lucru întâmplă atunci când încerci să accesezi o zonă de memorie care nu îți este destinată. De exemplu, dacă ai declara un vector de 10 elemente int a[10] și după ai vrea să folosești a[15], ar fi foarte probabil ca programul tău să primească SIGSEGV.

Recomand să citești acest articol (http://www.infoarena.ro/documentatie/evaluator) din documentația evaluatorului de pe infoarena.