Cod sursa(job #1507023)

Utilizator TonyFrumTony Frum TonyFrum Data 21 octombrie 2015 11:08:03
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
//#include<iostream>
#include<fstream>
#include<deque>
#include<stdlib.h>
using namespace std;

ifstream f("k1.in");
ofstream g("k1.out");

int compare (const void * a, const void * b)
{
  return ( *(short*)a - *(short*)b );
}

 void max_heapify(short *a, int i, int n)
{
    int j, temp;
    temp = a[i];
    j = 2*i;
    while (j <= n)
    {
        if (j < n && a[j+1] > a[j])
            j = j+1;
        if (temp > a[j])
            break;
        else if (temp <= a[j])
        {
            a[j/2] = a[j];
            j = 2*j;
        }
    }
    a[j/2] = temp;
    return;
}
void heapsort(short *a, int n)
{
    int i, temp;
    for (i = n; i >= 2; i--)
    {
        temp = a[i];
        a[i] = a[1];
        a[1] = temp;
        max_heapify(a, 1, i - 1);
    }
}
void build_maxheap(short *a, int n)
{
    int i;
    for(i = n/2; i >= 1; i--)
    {
        max_heapify(a, i, n);
    }
}


int main()
{
    int i,n,sum,k=0;
    short s[1000001];
    bool sem=0;
    deque<int> v;
    f>>n;
    for(i=1;i<=n;i++)
        f>>s[i];

    build_maxheap(s,n);
    heapsort(s, n);
   // qsort (s, n, sizeof(short), compare);
    for(i=0;i<n;i++)
        s[i]=s[i+1];
    v.push_back(s[0]);
    v.push_back(s[1]);
    //for(i=0;i<n;i++)
    //    cout<<s[i]<<" ";
    i=2;
    sum=v[0]+v[1];
    k+=sum;
    while(i<n)
    {
        if(sum>s[i])
        {
            v.push_back(s[i]);
            i++;
        }
        else
        {
            sem=1;
            v.push_back(sum);
            if(v.size()<=3)
            {
                /*if(v.size()<2)
                {

                }
                v.pop_front();
                sum=v[0]+s[i];
                i++;
                k+=sum;*/


               // else
                //{
                    v.pop_front();
                    v.pop_front();
                    v.push_back(s[i]);
                    i++;
                    sum=v[0]+v[1];
                    k+=sum;
                //}
            }
            else
            {
                v.pop_front();
                v.pop_front();
                sum=v[0]+v[1];
                k+=sum;
            }
        }
    }
    while(v.size()>1)
    {
        v.push_back(sum);
        v.pop_front();
        v.pop_front();
        if(v.size()>1)
        {
            sum=v[0]+v[1];
            k+=sum;
        }
    }
    if(v.size()==0)
        k-=sum;
    g<<k;
    f.close();
    g.close();
    return 0;
}