Cod sursa(job #1549515)

Utilizator daneel95Holteiu Daniel-Ninel daneel95 Data 12 decembrie 2015 13:57:51
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.84 kb
#include <fstream>
#define ll long long

using namespace std;

ifstream in("huffman.in");
ofstream out("huffman.out");

ll a[1000001],n,aux[10001];
ll coada[1000001];

ll minim(ll a,ll b,ll &i,ll &s)
{
    if(a<=b)
    {
        i++;
        return a;
    }else{
        s++;
        return b;
    }
}

void quickSort(ll a[], ll l, ll r) {
      ll i = l, j = r;
      ll aux;
      ll pivot = a[(l + r) / 2];

      while (i <= j) {
            while (a[i] < pivot)
                  i++;
            while (a[j] > pivot)
                  j--;
            if (i<= j) {
                  aux = a[i];
                  a[i] = a[j];
                  a[j] = aux;
                  i++;
                  j--;
            }
      }

      if (l < j)
            quickSort(a, l, j);
      if (i < r)
            quickSort(a, i, r);
}

int main()
{
    ll i,s,d,x;
    ll s1,s2;
    ll sum=0;
    in>>n;
    for(i=1;i<=n;i++) in>>a[i];
    quickSort(a,1,n);
    s=1;
    d=0;
    i=1;
    while(i<=n)
    {
        if(n-i>=1 && d-s<0)
        {
            d++;
            s1=a[i];
            s2=a[i+1];
            sum+=s1+s2;
            coada[d]=s1+s2;
            i+=2;
            //out<<"Adaug la suma: "<<s1<<" si "<<s2<<" in total: "<<s1+s2<<"\n";
        }else if(n-i>=1 && d-s==0)
                {
                    s1=minim(a[i],coada[s],i,s);
                    if(d-s<0)
                        {
                            s2=a[i];
                            i++;
                        }
                        else s2=minim(a[i],coada[s],i,s);
                    d++;
                    coada[d]=s1+s2;
                    sum+=s1+s2;
                    //out<<"Adaug la suma: "<<s1<<" si "<<s2<<" in total: "<<s1+s2<<"\n";
                }else if(n-i>=1 && d-s>=1)
                        {
                            s1=minim(a[i],coada[s],i,s);
                            s2=minim(a[i],coada[s],i,s);
                            sum+=s1+s2;
                            d++;
                            coada[d]=s1+s2;
                            //out<<"Adaug la suma: "<<s1<<" si "<<s2<<" in total: "<<s1+s2<<"\n";
                        }else if(n-i==0 && d-s>=1)
                                {
                                    s1=minim(a[i],coada[s],i,s);
                                    if(n-1==0) s2=minim(a[i],coada[s],i,s);
                                        else
                                            {
                                                s2=coada[s];
                                                s++;
                                            }
                                    d++;
                                    sum+=s1+s2;
                                    coada[d]=s1+s2;
                                    //out<<"Adaug la suma: "<<s1<<" si "<<s2<<" in total: "<<s1+s2<<"\n";
                                }else if(n-i==0 && d-s==0)
                                        {
                                            s1=a[i];
                                            s2=coada[s];
                                            i++;
                                            s++;
                                            d++;
                                            coada[d]=s1+s2;
                                            sum+=s1+s2;
                                            //out<<"Adaug la suma: "<<s1<<" si "<<s2<<" in total: "<<s1+s2<<"\n";
                                        }
    }

    while(d-s>=1)
    {
        s1=coada[s];
        s2=coada[s+1];
        s+=2;
        sum+=s1+s2;
        d++;
        coada[d]=s1+s2;
        //out<<"Adaug la suma: "<<s1<<" si "<<s2<<" in total: "<<s1+s2<<"\n";
    }

    out<<sum;

    in.close();
    out.close();
    return 0;
}