Advertisement
R-Man

CEX 2014 Heapuri

Nov 24th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <fstream>
  3. #define NMAX 200001
  4. using namespace std;
  5.  
  6. ifstream fin("heapuri.in");
  7. ofstream fout("heapuri.out");
  8.  
  9. void inserare(int H[NMAX], int &n, int x)
  10. {
  11.     int fiu, tata;
  12.     fiu=++n;
  13.     tata=fiu/2;
  14.     while(tata && H[tata]>x)
  15.     {
  16.         H[fiu]=H[tata];
  17.         fiu=tata;
  18.         tata=fiu/2;
  19.     }
  20.     H[fiu]=x;
  21. }
  22.  
  23. void creare_heap_inserare(int H[NMAX], int n)
  24. {
  25.     int nr,i,x;
  26.     n=0;
  27.     fin >> nr;
  28.     for(i=1; i<nr; i++)
  29.     {
  30.         fin >> x;
  31.         inserare(H,n,x);
  32.     }
  33.  
  34. }
  35.  
  36.  
  37. void combinare(int H[NMAX], int n, int i)
  38. {
  39.     int x=H[i], tata, fiu;
  40.     tata=i;
  41.     fiu=2*i;
  42.     while(fiu <=n)
  43.     {
  44.         if(fiu+1<=n && H[fiu+1] < H[fiu]) fiu++; // cel mai mic dintre fii
  45.         if(H[fiu]<x)
  46.         {
  47.             H[tata]=H[fiu];
  48.             tata=fiu;
  49.             fiu=tata*2;
  50.         }
  51.         else break; // am gasit locul potrivit
  52.     }
  53.     H[tata]=x;
  54. }
  55.  
  56. void creare_heap_combinare(int H[NMAX], int &n)
  57. {
  58.     int i;
  59.     fin >> n;
  60.     for(i=1; i<n; i++)
  61.         fin >> H[i];
  62.     for(i=n/2; i>0; i--)
  63.         combinare(H,n,i);
  64. }
  65.  
  66. int extrag_min(int H[NMAX],int n)
  67. {
  68.     int minim=H[1];
  69.     H[1]=H[n--];
  70.     combinare(H,n,1);
  71.     return minim;
  72. }
  73.  
  74. int main()
  75. {
  76.     int n, x, i;
  77.     int H[NMAX];
  78.     creare_heap_combinare(H,n);
  79.     fout << extrag_min(H,n);
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement