Cod sursa(job #1549515)
Utilizator | 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;
}