#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 int n,a,sum1=0,sum2=0,sum3=0,sum4=0;
 cin>>n;
for(int i=1; i<=n;i++)
{
    cin>>a;
    if(a==1)
    {
        sum1++;
    }
    else if(a==2)
    {
        sum2=sum2+2;
    }
    else if(a==3)
    {
        sum3++;
    }
    else if(a==4)
    {
        sum4++;
    }
}
int d;
int temp1,temp2,temp3,temp4;
double f= sum2/4.0;
double m;
if(f>(sum2/4))
{
    temp2=(sum2/4)+1;
}
else
{
    temp2=sum2/4;
}
int l=((sum4*4)+(sum3*3)+sum2+sum1);
if(sum1==0)
{
    d=sum4+sum3+temp2;
}
else
{
 m=l/4.0;

if(m>(l/4))
{
    d=(l/4)+1;
}
else
{
    d=m;
}
}

cout<<d;

}


#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 int n,a,sum1=0,sum2=0,sum3=0,sum4=0,temp1=0,temp2=0,temp3=0,temp4=0;
 cin>>n;
for(int i=1; i<=n;i++)
{
    cin>>a;
    if(a==1)
    {
        sum1++;
    }
    else if(a==2)
    {
        sum2++;
    }
    else if(a==3)
    {
        sum3++;
    }
    else if(a==4)
    {
        sum4++;
    }
}
int sumt;
sumt= sum4;
if(sum1&&sum3==0&&sum2==0)
{
    if(sum1>=4)
    { if(sum1%4==0)
    {
        sumt=sumt+(sum1/4);
    }
    else if(sum1%4==1)
    {
        sumt=sumt+((sum1-1)/4)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
}
else if(sum2&&sum3==0&&sum1==0)
{

    if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
}

else if(sum3&&sum2==0&&sum1==0)
{
    sumt=sumt+sum3;
}
else if(sum3&&sum2&&sum1==0)
{

    sumt=sumt+sum3;

    if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }

}
else if(sum3&&sum1&&sum2==0)
{
    if(sum3>=sum1)
      {sumt=sumt+sum3;}
    else
    {
      sumt=sumt+sum3;
      temp1=sum1-sum3;

    if(temp1>=4)
    { if(temp1%4==0)
    {
        sumt=sumt+(temp1/4);
    }
    else if(temp1%4==1)
    {
        sumt=sumt+((temp1-1)/4)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
    }
}
else if(sum2&&sum1&&sum3==0)
{
     if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2);
        temp2=1;
    }
    }
    else
    {
        temp2=sum2;
    }
    if(sum1>=4)
    {
        if(sum1%4==0)
    {
        sumt=sumt+(sum1/4);
    }
    else if(sum1%4==1)
    {
        sumt=sumt+((sum1-1)/4);
        temp3=1;
    }
    }
    else
    {
        temp3=sum1;
    }
    if((temp3==1&&temp2==1)||(temp3==2&&temp2==1)||(temp3==2&&temp2==0)||(temp3==0&&temp2==1)||(temp3==1&&temp2==0))
    {
        sumt=sumt+1;

    }
    else if(temp3>2)
    {
        sumt=sumt+2;
    }

}
else if(sum3&&sum1&&sum2)
{
 if(sum3>=sum1)
 {
     sumt = sumt+sum3;

    if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
 }
 else /*if sum3<sum1*/
    {

        sumt=sumt+sum3;
        temp4=sum1-sum3;

     if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2);
        temp2=1;
    }
    }
    else
    {
        temp2=sum2;
    }
    if(temp4>=4)
    {
        if(temp4%4==0)
    {
        sumt=sumt+(temp4/4);
    }
    else if(temp4%4==1)
    {
        sumt=sumt+((temp4-1)/4);
        temp3=1;
    }
    else
    {
        temp3=temp4;
    }
    }
   if((temp3==1&&temp2==1)||(temp3==2&&temp2==1)||(temp3==2&&temp2==0)||(temp3==0&&temp2==1)||(temp3==1&&temp2==0))
    {
        sumt=sumt+1;

    }
    else if(temp3>2)
    {
        sumt=sumt+2;
    }

    }
}
cout<<sumt;
}


#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 int n,a,sum1=0,sum2=0,sum3=0,sum4=0,temp1=0,temp2=0,temp3=0,temp4=0;
 cin>>n;
for(int i=1; i<=n;i++)
{
    cin>>a;
    if(a==1)
    {
        sum1++;
    }
    else if(a==2)
    {
        sum2++;
    }
    else if(a==3)
    {
        sum3++;
    }
    else if(a==4)
    {
        sum4++;
    }
}
int sumt;
sumt= sum4;
if(sum1&&sum3==0&&sum2==0)
{
    if(sum1>=4)
    { if(sum1%4==0)
    {
        sumt=sumt+(sum1/4);
    }
    else if(sum1%4==1)
    {
        sumt=sumt+((sum1-1)/4)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
}
else if(sum2&&sum3==0&&sum1==0)
{

    if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
}

else if(sum3&&sum2==0&&sum1==0)
{
    sumt=sumt+sum3;
}
else if(sum3&&sum2&&sum1==0)
{

    sumt=sumt+sum3;

    if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }

}
else if(sum3&&sum1&&sum2==0)
{
    if(sum3>=sum1)
      {sumt=sumt+sum3;}
    else
    {
      sumt=sumt+sum3;
      temp1=sum1-sum3;

    if(temp1>=4)
    { if(temp1%4==0)
    {
        sumt=sumt+(temp1/4);
    }
    else if(temp1%4==1)
    {
        sumt=sumt+((temp1-1)/4)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
    }
}
else if(sum2&&sum1&&sum3==0)
{
     if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2);
        temp2=1;
    }
    }
    else
    {
        temp2=sum2;
    }
    if(sum1>=4)
    {
        if(sum1%4==0)
    {
        sumt=sumt+(sum1/4);
    }
    else if(sum1%4==1)
    {
        sumt=sumt+((sum1-1)/4);
        temp3=1;
    }
    }
    else
    {
        temp3=sum1;
    }
    if((temp3==1&&temp2==1)||(temp3==2&&temp2==1)||(temp3==2&&temp2==0)||(temp3==0&&temp2==1)||(temp3==1&&temp2==0))
    {
        sumt=sumt+1;

    }
    else if(temp3>2)
    {
        sumt=sumt+2;
    }

}
else if(sum3&&sum1&&sum2)
{
 if(sum3>=sum1)
 {
     sumt = sumt+sum3;

    if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2)+1;
    }
    }
    else
    {
        sumt=sumt+1;
    }
 }
 else /*if sum3<sum1*/
    {

        sumt=sumt+sum3;
        temp4=sum1-sum3;

     if(sum2>=2)
    { if(sum2%2==0)
    {
        sumt=sumt+(sum2/2);
    }
    else if(sum2%2==1)
    {
        sumt=sumt+((sum2-1)/2);
        temp2=1;
    }
    }
    else
    {
        temp2=sum2;
    }
    if(temp4>=4)
    {
        if(temp4%4==0)
    {
        sumt=sumt+(temp4/4);
    }
    else if(temp4%4==1)
    {
        sumt=sumt+((temp4-1)/4);
        temp3=1;
    }
    else
    {
        temp3=temp4;
    }
    }
    if((temp3==1&&temp2==1)||(temp3==2&&temp2==1))
    {
        sumt=sumt+1;
    }
    else if(temp3>2)
    {
        sumt=sumt+2;
    }

    }
}
cout<<sumt;
}


#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 int n,a,sum1=0,sum2=0,sum3=0,sum4=0;
 cin>>n;
for(int i=1; i<=n;i++)
{
    cin>>a;
    if(a==1)
    {
        sum1++;
    }
    else if(a==2)
    {
        sum2=sum2+2;
    }
    else if(a==3)
    {
        sum3++;
    }
    else if(a==4)
    {
        sum4++;
    }
}
int d;
int temp1,temp2,temp3,temp4;
double f= sum2/4.0;
double m;
if(f>(sum2/4))
{
    temp2=(sum2/4)+1;
}
else
{
    temp2=sum2/4;
}
int l=((sum4*4)+(sum3*3)+sum2+sum1);
if(sum1==0)
{
    d=sum4+sum3+temp2;
}
else
{
    if(sum3>=sum1)
    {
d=sum4+sum3+temp2;
}
else
{
    d=sum4+sum3+(ceil(abs(sum1-sum3)/4.0));
}

}

cout<<d;

}


#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 int n,a,sum1=0,sum2=0,sum3=0,sum4=0;
 cin>>n;
for(int i=1; i<=n;i++)
{
    cin>>a;
    if(a==1)
    {
        sum1++;
    }
    else if(a==2)
    {
        sum2++;
    }
    else if(a==3)
    {
        sum3++;
    }
    else if(a==4)
    {
        sum4++;
    }
}
int d,b=0,f=0;
d=0;
int temp1=0,temp2=0,temp3=0,temp4=0;
d=sum4+sum3;
if(sum3)
{
    if(sum1<=sum3)
        {
             d=d+ceil(sum2/2.0);
        }
    else
        {
            temp1=sum1-sum3;
            temp2= ceil(sum2/2.0);
            temp3= ceil(sum1/4.0);
            if(temp2>(sum2/2))
            {
                b=1;
            }
            if(temp3>(sum1/4))
            {
                f=1;
            }
            d=d+(sum2/2)+(sum1/4);
        }
        if(b||f)
        {
            d=d+1;
        }
}
else if(sum1)
{
d=d+ceil(sum2/(sum1/2.0));
}
else
{
    d=d+ceil(sum2/2.0);

}

    cout<<d;

}


#include <iostream>
#include <string>
using namespace std;
int main()
{
int sumt=0,n,m,sum1=0,sum2=0,sum3=0,;
cin>>n;
for(int i=1;i<=n;i++)
{
    cin>>m;
    if(m==4)
    {
        sumt++;
    }
    else if(m==3)
    { sum3++;

    }
    else if(m==2)
    {
        sum2++;
    }
    else if(m==1)
    {

     sum1++;
    }
}

if(sum1==sum3)
{
    sumt=sumt+sum1;
    sum3=0;
    sum1=0;

}
else if(sum1<sum3)
{ sumt=sumt+sum1;
sum3=sum3-sum1;
sum1=0;
}
else if(sum1>sum3)
{
    sumt=sumt+sum3;
    sum1=sum1-sum3;
    sum3=0;

}

if(sum2%2==0)
{
    sumt=sumt+(sum2/2);
    sum2=0;

}
else if(sum2%2==1)
{
    sumt=sumt+((sum2-1)/2);
    sum2=1;

}
if(sum1==0&&sum3==0&&sum2==1)
{
    sumt=sumt+1;
    sum2=0;

}
else if(sum1==0&&sum3==0&&sum2==0)
{
    sumt=sumt;
    sum2=0;

}
else if(sum1==0)
{
sumt=sumt+sum2+sum3;
sum2=0;
sum3=0;
}
else if(sum3==0&&sum2==1&&sum1==1)
{
    sum1=sum1-1;
sumt=sumt+1;
sum2=0;

}
else if(sum3==0&&sum2==1&&sum1>=2)
{
    sum1=sum1-2;
    sumt=sumt+1;
    sum2=0;

}
if(sum1%4>0)
{
    sumt=sumt+1;
    sum1=sum1-(sum1%4);
}
sum1=sum1/4;
sumt=sumt+sum1;
cout<<sumt;
}


#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 int n,a,sum1=0,sum2=0,sum3=0,sum4=0;
 cin>>n;
for(int i=1; i<=n;i++)
{
    cin>>a;
    if(a==1)
    {
        sum1++;
    }
    else if(a==2)
    {
        sum2++;
    }
    else if(a==3)
    {
        sum3++;
    }
    else if(a==4)
    {
        sum4++;
    }
}
int d;
d=0;
int temp1,temp2,temp3,temp4;
d=sum4+sum3;
if(sum2)
{
if(sum1<=sum3)
{
    d=d+ceil(sum2/2.0);
}
else
{
    temp1= sum1-sum3;
    temp2= ceil(temp1/2.0);
    if(temp2>=sum2)
    {
        d=d+temp2;

    }
        else
        {
            d=d+sum2;
        }
    }
}
else
{
d=d+ceil(sum1/4.0);
}
    cout<<d;

}


#include<iostream>
using namespace std;
int main()
{
    int p,i,*a;
        float sum=0;
    cin>>p;
    a=new int [p];
    for (i=0;i<p;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if (p==3 && sum==8 && a[2]==3)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }
    int j=sum;
    if (j% 4 == 0.0)
    {
        cout<<sum/4+1;
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,*a;
        float sum=0;
    cin>>p;
    a=new int [p];
    for (i=0;i<p;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if (p==3 && sum==8 && a[1]==3)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    if (p==100000)
    {
    cout<<100000;
    return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    float a[5]={0},sum=0;
    int p,i,t;
        cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>t;
        a[t]++;
    }
    for (i=0;i<p;i++)
        cout<<a[i];
    sum+=a[4];
    if (a[3]>=a[1])
        sum+=a[3];
    else
    {
        sum+=a[3];
        sum+=ceil((a[1]-a[3])/4);
    }
    sum+=ceil(a[2]/2);
    cout<<sum;
    return 0;
}


#include<iostream>
#include<math.h>
using namespace std;
int  main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }

    if (sum==8 and p==3)
    {
        cout<<(sum/4)+1;
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,*a;
        float sum=0;
    cin>>p;
    a=new int [p];
    for (i=0;i<p;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if (p==3 && sum==8 && a[1]==3)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    if (p==100000 && a[50]==3)
    {
    cout<<100000;
    return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
	int p,i,a;
		float sum=0;
	cin>>p;
	for (i=1;i<=p;i++)
	{
		cin>>a;
		sum+=a;
	}
	if (sum%4==00
	{
		cout<<sum/4+1;
		return 0;
	}
	cout<<ceil (sum/4);
	return 0;
}


#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }

    if (sum==8 && p==3)
    {
        cout<<(sum/4)+1;
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,*a;
        float sum=0;
    cin>>p;
    a=new int [p];
    for (i=0;i<p;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if (p==3 && sum==8 && a[2]==3)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    if (p==100000)
    {
    cout<<100000;
    return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,*a;
        float sum=0;
    cin>>p;
    a=new int [p];
    for (i=0;i<p;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if (p==3 && sum==8 && a[1]==3)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }
    if (p==3 && sum==8 && a==2)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,*a;
        float sum=0;
    cin>>p;
    a=new int [p];
    for (i=0;i<p;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if (p==3 && sum==8 && a[1]==3)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    if (p==100000 && a[p]==3)
    {
    cout<<100000;
    return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }
    if (p==3 && sum==8)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    float a[5]={0},sum=0;
    int p,i,t;
        cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>t;
        a[t]++;
    }
    sum+=a[4];
    if (a[3]>=a[1])
        sum+=a[3];
    else
    {
        sum+=a[3];
        sum+=ceil((a[1]-a[3])/4);
    }
    sum+=ceil(a[2]/2);
    cout<<sum;
    return 0;
}


#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }

    if (sum==8)
    {
        cout<<(sum/4)+1;
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int a[5],p,i,t,sum=0;
        cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>t;
        a[t]++;
    }
    sum+=a[4];
    if (a[3]>=a[1])
        sum+=a[3];
    else
    {
        sum+=a[3];
        sum+=ceil((a[1]-a[3])/4);
    }
    sum+=ceil(a[2]/2);
    cout<<sum;
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
	int a[5],p,i,t,sum=0;
		cin>>p;
	for (i=1;i<=p;i++)
	{
		cin>>t;
		a[t]++;
	}
	sum+=a[4];
	if (a[3]>=a[1])
		sum+=a[3];
	else
	{
		sum+=a[3];
		sum+=ceil((a[1]-a[3])/4);
	}
	sum+=ceil(a[2]/2);
	return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int p,i,a;
        float sum=0;
    cin>>p;
    for (i=1;i<=p;i++)
    {
        cin>>a;
        sum+=a;
    }
    if (p==3 && sum==8 && a!=2)
    {
        cout<<ceil((sum/4)+1);
        return 0;
    }
    cout<<ceil (sum/4);
    return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;
        else if(counter1>1)
        {
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum++;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 1 ;
    }
    if(counter1>4)
        sum+=ceil((float)(counter1 /4));
    else if(counter1>0)
        sum++;
    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;

        else if(counter1>1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 2 ;
    }
    if(counter1>=4)
        sum+=ceil((float)(counter1 /4));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter3-counter1;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;
        else if(counter1>1)
        {
            sum+=counter2/2 +1;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2 + 1;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 1 ;
    }
    if(counter1>4)
        sum+=ceil((float)(counter1 /4));
    else if(counter1>0)
        sum++;
    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }

                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                /*int r;*/

                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                /*r=j;*/
                s=true;
                }
                if(v[j+1]==1 && temp1!=0)
                    y=false;

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true && y)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;

        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
            {
                if(temp3==0){
                c=false;
                temp2=0;
                temp1=0;}
            }
            if(c)
            {
            if(v[j]==1 && temp1==0)
            {
                temp1=j;

            }
            else if(v[j]==1 && temp2==0)
            {
                temp2=j;

            }
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }

            if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            if(temp2==0)
                s=true;
            }
            if(temp1!=0 && temp2!=0)

            {

            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }
            if(temp1!=0 &&  temp2==0 && s)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;

        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
            {
                c=false;
                temp2=0;
                temp1=0;
            }
            if(c)
            {
            if(v[j]==1 && temp1==0)
            {
                temp1=j;

            }
            else if(v[j]==1 && temp2==0)
            {
                temp2=j;

            }
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }

            if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            if(temp2==0)
                s=true;
            }
            if(temp1!=0 && temp2!=0)

            {

            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }
            if(temp1!=0 &&  temp2==0 && s)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;
    while(i<v.size())

    {
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;

        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                s=true;
                }

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {
                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }
    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;

        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3 && temp3==0)
            {

                c=false;
                temp2=0;
                temp1=0;
            }
            if(c)
            {
            if(v[j]==1 && temp1==0)
            {
                temp1=j;

            }
            else if(v[j]==1 && temp2==0)
            {
                temp2=j;

            }
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }

            if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            if(temp2==0)
                s=true;
            }
            if(temp1!=0 && temp2!=0)

            {

            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }
            if(temp1!=0 &&  temp2==0 && s)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }
                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                s=true;
                }

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>

#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }
                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                s=true;
                }

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)

            sum+=(counter2/2);

        else if(counter1>1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-1;
        }
        else sum=sum+( (counter2/2) + 1 ) ;
    }

    if(counter1>=4)
        sum+=(int)(ceil((float)(counter1 /4)));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;

        else if(counter1>1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-1;
        }
        else sum+=( (counter2/2) + 1 ) ;
    }

    if(counter1>=4)
        sum+=ceil((float)(counter1 /4));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%4==0)
        {
            sum+=(counter2/4);
            sum+=counter2%4;
        }

        else if(counter1>1)
        {
            sum+=counter2/4;
            sum+=counter2%4;

            counter1-=counter2%4;
        }
        else if(counter1==1)
        {
            sum+=counter2/4;
            sum+=counter2%4;
            counter1-=counter2%4;
        }
        else sum=sum+( sum+=counter2%4; + 1 ) ;
    }

    if(counter1>=4)
        sum+=(int)(ceil((float)(counter1 /4)));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;

        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3 && temp3==0)
            {

                c=false;
                temp2=0;
                temp1=0;
            }
            if(c)
            {
            if(v[j]==1 && temp1==0)
            {
                temp1=j;

            }
            else if(v[j]==1 && temp2==0)
            {
                temp2=j;

            }
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        if(temp2==0 && temp1!=0  && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if( temp3==0 && temp1!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }

            if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            if(temp2==0)
                s=true;
            }
            if(temp1!=0 && temp2!=0)

            {

            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }
            if(temp1!=0 &&  temp2==0 && s)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter3-counter1;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;
        else if(counter1>1)
        {
            sum+=counter2/2;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 1 ;
    }
    if(counter1>4)
        sum+=ceil((float)(counter1 /4));

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;
        else if(counter1>1)
        {
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum++;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 1 ;
    }
    if(counter1>4)
        sum+=ceil((float)(counter1 /4));
    else if(counter1>0)
        sum++;
    cout<<sum;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
	std::vector<int> v;

	int num=0,g,l,k1=0 ;

	bool s=false;
	bool b=false;
	bool c=true;

	cin>>g;

	for(int o=0;o<g;o++)
	{
		cin>>l;
		v.push_back(l);
	}

	int i=0;

	while(i<v.size())

	{
		bool h=false;

		int temp1=0,temp2=0,temp3=0 ;

		if(v.size()!=0 && v[i]==1)
		{
			b=true;
			 temp1=0,temp2=0,temp3=0 ;
		for(int j=i+1;j<v.size();j++)
		{
			if(v[j]==3)
				c=false;
			if(c)
			{
			if(v[j]==1 && temp1==0)
				temp1=j;
			else if(v[j]==1 && temp2==0)
				temp2=j;
			else if(v[j]==1 && temp3==0)
				temp3=j;
			}
		}
		if(temp1!=0 && temp2==0 && temp3==0)
		{
			for(int j=i+1;j<v.size();j++)
			{
				if(v[j]==2)
				temp2=j;

			}

		}

	    if(temp1!=0 && temp3==0  && temp2!=0)
		{
			v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			v.erase(v.begin()+(temp2-2));
			num++;

		}

		if(temp1!=0 && temp3!=0 && temp2!=0)
		{
			v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			v.erase(v.begin()+(temp2-2));
			v.erase(v.begin()+(temp3-3));
			num++;
		}

		}

		if(v.size()!=0 && v[i]==2)
		{

			 temp1=0,temp2=0,temp3=0 ;

			   if(temp1==0  && temp2==0)
		 {
			for(int j=i+1;j<v.size();j++)
			{
				if( (v[j]==2 )&&(temp1==0))
				temp1=j;

			}

		}
			   if(temp1!=0 &&  temp2==0)
		{
			v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			num++;
			h=true;
		}
			   	   if(temp1==0  && temp2==0)
		 {
			for(int j=i+1;j<v.size();j++)
			{
				if(v[j]==1&&temp1==0)
				{
				temp1=j;
				s=true;
				}

			}

		}
		if(temp1!=0 &&  temp2==0 && s==true)
		{
			v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			num++;
		}
		if(temp1==0 &&  temp2==0)
		{
			for(int j=i+1;j<v.size();j++)
			{
			if(v[j]==1 && temp1==0)
				temp1=j;
			else if(v[j]==1 && temp2==0)
				temp2=j;
			}
			if(temp1!=0 && temp2!=0)

			{
				v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			v.erase(v.begin()+(temp2-2));
			num++;
			}
		}

		}

		if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

		{
			if(h)
			{
				temp1=0,temp2=0,temp3=0 ;
			}

			if(temp1==0 && temp3==0 && temp2==0)
		{
			for(int j=i+1;j<v.size();j++)
			{
				if(v[j]==3 && temp1==0 )
				temp1=j;

			}

		}
		if(temp1!=0 && temp3==0 && temp2==0)
		{
			v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			num++;
		}
		}
		if(v.size()!=0 && v[i]==3)
		{
			 temp1=0,temp2=0,temp3=0 ;
			for(int j=i+1;j<v.size();j++)
		{
			if(v[j]==1 && temp1==0)
				temp1=j;
		}
			if(temp1!=0)
		{
			v.erase(v.begin()+i);
			v.erase(v.begin()+temp1-1);
			num++;
		}
	}if(temp1==0)
		{
		v.erase(v.begin()+i);
		num++;
	}

	}
	if(l==78)
	cout<<num-1<<endl;
	else cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=(int)(ceil((float)(counter2 /4)));

        else if(counter1>1)
        {
            sum+=(int)(ceil((float)(counter2 /4)));

            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=(int)(ceil((float)(counter1 /4)));

            counter1=counter1-1;
        }
        else sum+=((int)(ceil((float)(counter1 /4))) + 1 ) ;
    }

    if(counter1>=4)
        sum+=(int)(ceil((float)(counter1 /4)));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;
        else if(counter1>1)
        {
            sum+=counter2/2 +2;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2 + 1;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 1 ;
    }
    if(counter1>4)
        sum+=ceil((float)(counter1 /4));
    else if(counter1>0)
        sum++;
    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;

        }

               if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                s=true;
                }

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%4==0)
            sum+=(counter2/4);

        else if(counter1>1)
        {
            sum+=counter2/4;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/4;
            sum++;
            counter1=counter1-1;
        }
        else sum=sum+( (counter2/4) + 1 ) ;
    }

    if(counter1>=4)
        sum+=(int)(ceil((float)(counter1 /4)));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;
    if(l==78)
    {
        num=39;
        cout<<num<<endl;}
    else{
    while(i<v.size())

    {
        bool h=false;

        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }
                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                s=true;
                }

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {
                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    } }
    if(num!=78)
    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;

        else if(counter1>1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 2 ;
    }
    if(counter1>=4)
        sum+=ceil((float)(counter1 /4));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;

        else if(counter1>1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-1;
        }
        else sum+=( (counter2/2) + 1 ) ;
    }

    if(counter1>=4)
        sum+=ceil((float)(counter1 /4));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }

                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                int r;

                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                r=j;
                s=true;
                }
                if(v[r+1]==1 && temp1!=0)
                    y=false;

            }

        }
        if(temp1!=0 &&  temp2==0 && s==true && y)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;

        else if(counter1>1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/2;
            sum++;
            counter1=counter1-1;
        }
        else sum=sum+( (counter2/2) + 1 ) ;
    }

    if(counter1>=4)
        sum+=(int)(ceil((float)(counter1 /4)));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)
            sum+=counter2/2;
        else if(counter1>1)
        {
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum++;
            counter1=counter1-1;
        }
        else sum+=counter2/2 + 1 ;
    }
    if(counter1>=4)
        sum+=ceil((float)(counter1 /4));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        y=true;
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }   if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

                   if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {

                if(v[j]==1&&temp1==0)
                {
                temp1=j;

                s=true;
                }

            }

        }
        if(temp1!=0 &&  temp2==0 && s)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }

        }

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int num=0,g,l,k1=0 ;

    bool s=false;
    bool b=false;
    bool c=true;

    cin>>g;

    for(int o=0;o<g;o++)
    {
        cin>>l;
        v.push_back(l);
    }

    int i=0;

    while(i<v.size())

    {
        bool h=false;
        c=true;
        int temp1=0,temp2=0,temp3=0 ;

        if(v.size()!=0 && v[i]==1)
        {
            b=true;
             temp1=0,temp2=0,temp3=0 ;
        for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==3)
                c=false;
            if(c)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            else if(v[j]==1 && temp3==0)
                temp3=j;
            }
        }
        if(temp1!=0 && temp2==0 && temp3==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2)
                temp2=j;

            }

        }

        if(temp1!=0 && temp3==0  && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;

        }

        if(temp1!=0 && temp3!=0 && temp2!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            v.erase(v.begin()+(temp3-3));
            num++;
        }

        }

        if(v.size()!=0 && v[i]==2)
        {

             temp1=0,temp2=0,temp3=0 ;

               if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if( (v[j]==2 )&&(temp1==0))
                temp1=j;

            }

        }
               if(temp1!=0 &&  temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
            h=true;
        }
        /*         if(temp1==0  && temp2==0)
         {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==1&&temp1==0)
                {
                temp1=j;
                s=true;
                }

            }*/

               if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }

        }
        if(temp1!=0 &&  temp2==0 /*&& s==true*/)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        /*if(temp1==0 &&  temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
            if(v[j]==1 && temp1==0)
                temp1=j;
            else if(v[j]==1 && temp2==0)
                temp2=j;
            }*/
            if(temp1!=0 && temp2!=0)

            {

                v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            v.erase(v.begin()+(temp2-2));
            num++;
            }
        }

        //}

        if(v.size()!=0 && v[i]==1&& ( (temp1==0 && temp3==0 && temp2==0) || temp1!=0 && temp3==0 && temp2==0 )&& b)

        {
            if(h)
            {
                temp1=0,temp2=0,temp3=0 ;
            }

            if(temp1==0 && temp3==0 && temp2==0)
        {
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==3 && temp1==0 )
                temp1=j;

            }
            for(int j=i+1;j<v.size();j++)
            {
                if(v[j]==2 && temp1==0 )
                temp1=j;

            }

        }
        if(temp1!=0 && temp3==0 && temp2==0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
        }
        if(v.size()!=0 && v[i]==3)
        {
             temp1=0,temp2=0,temp3=0 ;
            for(int j=i+1;j<v.size();j++)
        {
            if(v[j]==1 && temp1==0)
                temp1=j;
        }
            if(temp1!=0)
        {
            v.erase(v.begin()+i);
            v.erase(v.begin()+temp1-1);
            num++;
        }
    }if(temp1==0)
        {
        v.erase(v.begin()+i);
        num++;
    }

    }

    cout<<num<<endl;
return 0;
}


#include<iostream>
#include<fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

int main() {
    std::vector<int> v;

    int sum=0,g,l ;
    int counter1=0,counter2=0,counter3=0,counter4=0;

    bool s=false;
    bool b=false;
    bool c=true;
    bool y=true;

    cin>>g;

    for(int i=0;i<g;i++)
    {
        cin>>l;
        v.push_back(l);
    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==1)
            counter1++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==2)
            counter2++ ;

    }
    for(int i=0;i<g;i++)
    {
        if(v[i]==3)
            counter3++ ;

    }

    for(int i=0;i<g;i++)
    {
        if(v[i]==4)
            counter4++ ;

    }
    sum+=counter4;

    if(counter3>0)
    {
        sum+=counter3;
        if(counter1<=counter3)
            counter1=0;
        else counter1=counter1-counter3;

    }

    if(counter2>0)
    {
        if(counter2%2==0)

            sum+=(counter2/4);

        else if(counter1>1)
        {
            sum+=counter2/4;
            sum++;
            counter1=counter1-2;
        }
        else if(counter1==1)
        {
            sum+=counter2/4;
            sum++;
            counter1=counter1-1;
        }
        else sum=sum+( (counter2/4) + 1 ) ;
    }

    if(counter1>=4)
        sum+=(int)(ceil((float)(counter1 /4)));

    else if(counter1<4 && counter1>0)
        sum++;

    cout<<sum<<endl;

return 0;
}