After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to celebrate his birthday. We know that the i-th group consists of si friends (1 ≤ si ≤ 4), and they want to go to Polycarpus together. They decided to get there by taxi. Each car can carry at most four passengers. What minimum number of cars will the children need if all members of each group should ride in the same taxi (but one taxi can take more than one group)?

The first line contains integer n (1 ≤ n ≤ 105) — the number of groups of schoolchildren. The second line contains a sequence of integers s1, s2, ..., sn (1 ≤ si ≤ 4). The integers are separated by a space, si is the number of children in the i-th group.

Print the single number — the minimum number of taxis necessary to drive all children to Polycarpus.

NoteIn the first test we can sort the children into four cars like this:  the third group (consisting of four children),  the fourth group (consisting of three children),  the fifth group (consisting of three children),  the first and the second group (consisting of one and two children, correspondingly). There are other ways to sort the groups into four cars.

<?php
function read() {
	fscanf(STDIN, "%d", $n);
	$groups = explode(" ", trim(fgets(STDIN)));
	return $groups;
}

function get_sum($counts) {

	$sum = $counts[4] + $counts[3];
	$diff = $counts[1] - $counts[3];	// left 1s from combining them with 3s
	// combine the left 1s with 2s and get the sum
	$sum += ceil( (($diff > 0 ? $diff : 0)) / 4 + $counts[2] / 2);

	return $sum;
}

function get_counts($groups){

	$counts = array(0,0,0,0,0);
	foreach ($groups as $g) $counts[$g]++;

	return $counts;
}

$groups = read();
$counts = get_counts($groups);
$sum = get_sum($counts);

echo $sum;

<?php
function read() {
	fscanf(STDIN, "%d", $n);
	$groups = explode(" ", trim(fgets(STDIN)));
	return $groups;
}

function get_sum($counts) {
	$sum = $counts[4] + $counts[3];
	$sum += ceil( (($counts[1] - $counts[3] > 0 ? $counts[1] - $counts[3] : 0)) / 4 + $counts[2] / 2);
	return $sum;
}

function get_counts($groups){

	$counts = array(0,0,0,0,0);
	foreach ($groups as $g) $counts[$g]++;

	return $counts;
}

$groups = read();
$counts = get_counts($groups);
$sum = get_sum($counts);

echo $sum;

<?php
fscanf(STDIN, "%d", $n);
$line = trim(fgets(STDIN));
$groups = explode(" ", $line);
$result = 0;
$count = 0;
$ready_groups = array(1=>0,2=>0,3=>0,4=>0);
foreach ($groups as $key => $value) {
	$ready_groups[$value]++;
}
if ($ready_groups[2] % 2 == 0) {
	$result = $ready_groups[2]/2;
	$ready_groups[2]=0;
} else {
	$ready_groups[2] -= 1;
	$result = $ready_groups[2]/2;
	$ready_groups[2] = 1;
}
if ($ready_groups[1] > $ready_groups[3]) {
	$result += $ready_groups[3];
	$ready_groups[1] -= $ready_groups[3];
	$ready_groups[3] = 0;
} else {
	$result += $ready_groups[1];
	$ready_groups[3] -= $ready_groups[1];
	$ready_groups[1] = 0;
}
if ($ready_groups[1] > 0 && $ready_groups[2] > 0) {
	$result += 1;
	$ready_groups[1] -= 2;
	$ready_groups[2] = 0;
}
if ($ready_groups[1] > 0) {
	if ($ready_groups[1]/4 >= 1) {
		$result += round($ready_groups[1]/4);
		$ready_groups[1] -= round($ready_groups[1]/4) * 4;
	}
	if ($ready_groups[1] > 0) {
		$ready_groups[1] = 0;
		$result++;
	}
}
$result += $ready_groups[4];
$result += $ready_groups[3];
$result += $ready_groups[2];
if ($count > 0) $result++;
fprintf(STDOUT, $result);

<?php

$stdin = fopen('php://stdin', 'r');

fscanf($stdin, "%d", $n);

$result = explode(' ', trim(fgets($stdin)));

rsort($result);

$freq = array();
foreach($result as $num)
{
	if(!isset($freq[$num]))
	{
		$freq[$num] = 0;
	}

	$freq[$num]++;
}

$maxInCar = 4;

$cars = 0;

foreach($result as $num)
{
	if($freq[$num] > 0)
	{
		$freq[$num]--;

		$sum = $maxInCar - $num;
		$ended = true;

		foreach($freq as $n => $count)
		{
			for($i = 0; $i < $count; $i++)
			{
				if($sum >= $n)
				{
					$sum -= $n;
					$freq[$n]--;
				}
				else
				{
					break;
				}
			}
		}

		$cars++;
	}
}

echo $cars;

<?php

$stdin = fopen('php://stdin', 'r');

fscanf($stdin, "%d", $n);

$result = explode(' ', trim(fgets($stdin)));

rsort($result);

$freq = array();
foreach($result as $num)
{
	if(!isset($freq[$num]))
	{
		$freq[$num] = 0;
	}

	$freq[$num]++;
}

$maxInCar = 4;

$cars = 0;

foreach($result as $num)
{
	if($freq[$num] > 0)
	{
		$freq[$num]--;

		$sum = $maxInCar - $num;
		$ended = true;

		foreach($freq as $n => $count)
		{
			if($sum >= $n)
			{
				for($i = 0; $i < $count; $i++)
				{
					$sum -= $n;
					$freq[$n]--;

					if($sum < $n)
					{
						break;
					}
				}

				if(!$sum)
				{
					break;
				}
			}
		}

		$cars++;
	}
}

echo $cars;

<?php

$stdin = fopen('php://stdin', 'r');

fscanf($stdin, "%d", $n);

$format = '';
for($i = 0; $i < $n; $i++)
{
	$format .= '%d ';
}

trim($format, ' ');

$result = fscanf($stdin, $format);

$freq = array();
foreach($result as $num)
{
	if(!isset($freq[$num]))
	{
		$freq[$num] = 0;
	}

	$freq[$num]++;
}

$maxInCar = 4;

$cars = 0;

if(isset($freq[4]))
{
	$cars += $freq[4];
}

if(isset($freq[3]))
{
	if(isset($freq[1]))
	{
		$freq[1] -= min($freq[1], $freq[3]);
	}

	$cars += $freq[3];
}

if(isset($freq[1]))
{
	if(!isset($freq[2]))
	{
		$freq[2] = 0;
	}

	$freq[2] += $freq[1] / 2;
}

if(isset($freq[2]))
{
	$cars += ceil($freq[2] * 2 / 4);
}

echo $cars;

<?php
while(($line = fgets(STDIN)) != false)
{
    $arr[] = $line;
}

$group_number = $arr[0];
$group_array = explode(" ", $arr[1]);

$cars = 0;
$current_car = 0;

$three = 0;
$two = 0;
$one = 0;

    //Первый этам, ищем четверки
    for ($i=0; $i<count($group_array); $i++) {
    //foreach ($group_array as $key=>$people) {
        $people = $group_array[$i];
        $key = $i;
        if ($people == 4) {
            $cars++;
            //unset($group_array[$key]);
        }

        if ($people == 3) {

            if ($one>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                $one--;
            } else {
                $three++;
            }
        }
        if ($people == 2) {
            if ($two>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                $two--;
                //unset()
            } else {
                $two++;
            }
        }
        if ($people== 1) {
            if ($three>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                $three--;
            } else {
                $one++;
            }
        }
    }

    if ($three>0) {
        $cars += $three;
    }

    if ($two>0) {
        if ($one>0) {
            $cars++;
            if ($one>2) {
                $count_one = $one-2;
                $cars += ceil($count_one/4);
                $one = 0;
            } else {
                $one = 0;
            }
        } else {
            $cars += $two;
        }
    }

    if ($one > 0) {
        $cars += ceil($one/4);
    }

    //echo $cars;
    fputs(STDOUT, $cars);
    ?>

<?php

fscanf(STDIN, "%d\n", $number);
$line = trim(fgets(STDIN));
$studentArray = explode(' ', $line, $number);

$counter = 0;
$fourCounter = 0;
$threeCounter = 0;
$twoCounter = 0;
$oneCounter = 0;

foreach($studentArray as $val){
    if($val == 4) $fourCounter++;
    elseif($val == 3) $threeCounter++;
    elseif($val == 2) $twoCounter++ ;
    elseif($val == 1) $oneCounter++ ;
}

if($oneCounter>$threeCounter){
    $extra = $oneCounter - $threeCounter ;
    $totalOne = $twoCounter*2 + $extra ;
    $counter = $fourCounter + $threeCounter + ceil($totalOne/4);

}else{
    $counter = $fourCounter + $threeCounter + ceil($twoCounter/2);
}

fwrite(STDOUT, $counter."\n");

<?php

	$i = (int) fgets(STDIN);
	$taxi = (int) 0;
	$taxi1=0;
	$taxi2=0;
	$taxi3=0;
	$arr = explode(' ', fgets(STDIN));

	for($z=0; $z<sizeof($arr); $z++){
		$input = $arr[$z];
		if($input == 4){
			$taxi++;
		}
		if($input == 3){
			$taxi++;
			$taxi3++;
		}
		if($input == 2){
			$taxi2++;
		}
		if($input == 1){
			$taxi1++;
		}
	}

	$taxi += floor($taxi2/2);
	$taxi1 -= $taxi3;
	$flag = 0;
	if($taxi2%2!=0){
		$taxi++;
		if($taxi1>0){
			$taxi1--;
			$flag = 1;
		}

	}
	if($taxi1>0){
		if($flag==1) $taxi1--;
		$taxi += floor($taxi1/4) ;
		if($taxi1%4!=0){
			$taxi++;
		}
	}

	printf("%d", $taxi);
?>

<?php
	$total = 0;
	$list_1 = 0;
	$list_2 = 0;
	$list_3 = 0;
	$list_4 = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	foreach ($list as $val) {
		if ($val == 1) $list_1++;
		elseif ($val == 2) $list_2++;
		elseif ($val == 3) $list_3++;
		elseif ($val == 4) $list_4++;
	}
	// single 4
	$total = $list_4;
	// combination 1 3
	$min = min($list_1,$list_3);
	$list_1 -= $min;
	$list_3 -= $min;
	$total += $min;
	// single 3
	$total += $list_3;
	// double 2
    $min = floor($list_2 / 2);
    $list_2 -= $min*2;
	$total += $min;
	// combination 1 1 2
	$min = min(floor($list_1/2),$list_2);
	$list_1 -= 2*$min;
	$list_2 -= $min;
	$total += $min;
	// combination 1 2
	$min = min($list_1,$list_2);
	$list_1 -= $min;
	$list_2 -= $min;
	$total += $min;
	// single 2
	$total += $list_2;
	// combination 1
	$total += ceil($list_1 / 4);
    echo $total;
	/*
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	rsort($list);
	while (count($list) > 0) {
		while (count($list) > 1) {
            if ($list[0] + $list[count($list)-1] <= 4) {
                $list[0] += $list[count($list)-1];
                unset($list[count($list)-1]);
                $list = array_values($list);
            } else {
                break;
            }
        }
		unset($list[0]);
        $list = array_values($list);
		$total++;
	}
	echo $total;
	*/

<?php
$input = STDIN;
$output = STDOUT;

fscanf($input,"%d",$n);
$str = fgets($input);
$sCounts = array(1=>0,2=>0,3=>0,4=>0);
++$sCounts[(int)strtok($str," \t\n")];
for($i=1; $i<$n; ++$i) {
    ++$sCounts[(int)strtok(" \t\n")];
}

$taxiCount = 0;
$taxiCount += $sCounts[4] + $sCounts[3] + (int)($sCounts[2]/2);
if($sCounts[1] > $sCounts[3]) {
    $sCounts[1] -= $sCounts[3];
} else {
    $sCounts[1] = 0;
}
$sCounts[2] %= 2;
if($sCounts[2] == 1) {
    ++$taxiCount;
    if($sCounts[1] <= 2) {
        $sCounts[1] = 0;
    } else {
        $sCounts[1] -= 2;
    }
}
$taxiCount += (int)($sCounts[1]/4);
if($sCounts[1]%4 != 0) {
    ++$taxiCount;
}
fprintf($output,"%d",$taxiCount);

?>

<?php
  $input = dataProvider::get();
  $i = 0;
  $c = array(
    0 => 0,
    1 => 0,
    2 => 0,
    3 => 0,
    4 => 0,
  );
  foreach($input['counts'] as $count) {
    $c[intval($count)]++;
  }
  // забрали все четверки
  $i += $c[4];

  // забрали все тройки и единицы подсадили
  $i += $c[3];
  $c[1] = ($c[3] > $c[1]) ? 0 : $c[1] - $c[3];

  $i += ceil((($c[2] * 2) + $c[1]) / 4);

  dataProvider::set($i);

  class dataProvider
  {
      public static function get()
      {
          $stdin = file_get_contents('php://stdin');
          $lines = explode("\n", $stdin, 2);
          $lines[1] = explode(' ', $lines[1]);
          return array(
            'n' => intval($lines[0]),
            'counts' => $lines[1],
          );
      }

      public static function set($data)
      {
        file_put_contents('php://stdout', $data);
      }
  }
?>

<?
error_reporting(0);

$fp = fopen("php://stdin",'r');
$count = (int)(fgets($fp));
$group = explode(" ",  str_replace( "\n", '', fgets($fp) ) );

sort($group);

$start = 0;
$end = $count - 1;

while( true )
{
	if( $end == $start ){
		break;
	}
	if( $group[ $end ] + $group[ $start ] > 4 )
	{
		$end --;
	} else {
		$count --;
		$group[ $end ] += $group[ $start ];
		$start ++;
	}
}
echo $count;

fclose($fp);
?>

<?php
//$t = time();
$line1 = trim(fgets(STDIN));
$line2 = trim(fgets(STDIN));

$f = function ($n, $man) {
    //var_dump($n);
    //var_dump($man);
    $count = 0;
    $array1 = array();
    $array2 = array();
    $array3 = array();
    for($i=0; $i<count($man); $i++) {
        $a = $man[$i];
        switch ($a) {
            case '4':
                $count++;
            break;

            case '3':
                if(array_pop($array1)!==null) {
                    $count++;
                } else {
                    array_push($array3, 1);
                }
            break;

            case '2':
                if(array_pop($array2)!==null) {
                    $count++;
                } else {
                    array_push($array2, 1);
                }
            break;

            case '1':
                if(array_pop($array3)!==null) {
                    $count++;
                } else {
                    array_push($array1, 1);
                }
            break;
        }
    }

    $cArray2 = count($array2);
    for($i = 0; $i<$cArray2; $i++) {
        array_pop($array1);
        array_pop($array1);
        array_pop($array2);
        $count++;
    }

    $cArray1 = count($array1);
    for($i = 3; $i<$cArray1; $i+=4) {
        array_pop($array1);
        array_pop($array1);
        array_pop($array1);
        array_pop($array1);
        $count++;
    }

    //var_dump($array1);
    //var_dump($array2);
    //var_dump($array3);

    $count += count($array3);

    $ca = count($array1);
    $cb = floor($ca/4);
    $count += $cb;
    if(!($ca % 4 === 0))
        $count++;

    return $count;
};

//$line1 = '5';
//$line2 = '2 2 2 3 3 3 3 3 3';

//$line1 = (int)$line1;
$lineArray2 = explode(' ', $line2);

echo $f($line1, $lineArray2);

//echo "\r\n|=>", (time() - $t);

<?php
$num_group = trim(fgets(STDIN));
$str = trim(fgets(STDIN));
$taxi = 0;
$arr_penumpang = explode(" ",$str);
$count = array_count_values($arr_penumpang);

while($count[4]>0)
{
	$count[4] = $count[4] - 1;
	$taxi = $taxi + 1;
}
while($count[3]>0)
{
	$count[3] = $count[3] - 1;
	if($count[1]>0)
	{
		$count[1] = $count[1] - 1;
	}
	$taxi = $taxi + 1;
}
while($count[2]>1)
{
	$count[2] = $count[2] - 2;
	$taxi = $taxi + 1;
}
while($count[1]>0)
{
	if($count[2]>0){
		$count[2] = $count[2] - 1;
		$count[1] = $count[1] - 2;
	}
	else
	{
		$count[1] = $count[1] - 4;
	}
	$taxi = $taxi + 1;
}
if($count[2]>0)
	$taxi = $taxi + 1;
echo $taxi;
?>

<?php
$dir = fopen("php://stdin", 'r');
$num_groups = fgets($dir);
$num_people = fgets($dir);
$num_people_in_group = explode(" ", $num_people);
$one=0;
$two=0;
$three=0;
$four=0;
$taxi=0;
$rest_one =0;
foreach ($num_people_in_group as $key => $value) {
	if ($value==1) {
		$one+=1;
	}elseif ($value==2) {
		$two+=1;
	}elseif ($value==3) {
		$three+=1;
	}elseif ($value==4) {
		$four+=1;
	}
}
//====================
if ($three == 0) {
	$sum = ($four*4+$two*2+$one);
	if ($sum%4==0 ) {
		$taxi=  $sum/4;
	}else{
		$taxi= intval($sum/4)+1;
	}
	goto  end;
}else{
	if ($one>=$three) {
		$rest_one = $one - $three;
		$taxi+=$three;
	}else{
		$rest_one=0;
		$taxi+=$three;
	}

	if ($rest_one ==0) {
		if ($two%2==0) {
			$taxi+=($two*2)/4;
		}else{
			$taxi+=intval(($two*2)/4)+1;
		}
	}else{
		$sum_two_and_one= (2*$two)+$rest_one;
		if ($sum_two_and_one%4==0) {
			$taxi+=$sum_two_and_one/4;
			$rest_one=0;
		}else{
			$taxi+=intval($sum_two_and_one/4)+1;
			$rest_one=0;
		}
	}

	if ($rest_one%4==0) {
		$taxi+=$rest_one/4;
	}else{
		$taxi+=intval($rest_one/4)+1;
	}
}
//=====================
$taxi+=$four;
end:
echo $taxi;

?>

<?php
$CountGrups = preg_replace('~[^0-9]~', '', fgets(STDIN));

$InStr = preg_replace('~[^0-9,\s]~', '', fgets(STDIN));
$Grups = explode(' ', $InStr);
$arCount = count($Grups);
$Grups[$arCount-1] = preg_replace('~[^0-9]~', '', $Grups[$arCount-1]);

rsort($Grups);

$Cars = 0;
$IncompleteTeam = array();
for($i = 0; $i < $CountGrups; $i++){
    if($Grups[$i] == '4'){
        $Cars++;
    }elseif($Grups[$i] == '3'){
        $IncompleteTeam['3']++;
    }elseif($Grups[$i] == '2'){
        $IncompleteTeam['2']++;
    }elseif($Grups[$i] == '1'){
        $IncompleteTeam['1']++;
    }
}

if($IncompleteTeam['1'] >= $IncompleteTeam['3']){
    $IncompleteTeam['1'] -= $IncompleteTeam['3'];
    $Cars += $IncompleteTeam['3'];
    unset($IncompleteTeam['3']);
}else{
    $IncompleteTeam['1'] = 0;
    $Cars += $IncompleteTeam['3'];
    unset($IncompleteTeam['3']);
}

if($IncompleteTeam['2'] % 2 == 0){
    $Cars += $IncompleteTeam['2'] / 2;
    unset($IncompleteTeam['2']);
}else{
    if($IncompleteTeam['1'] >= 2){
        $IncompleteTeam['1'] -= 2;
    }else{
        $IncompleteTeam['1'] = 0;
    }
    $Cars += ceil($IncompleteTeam['2'] / 2);
    unset($IncompleteTeam['2']);
}

$Cars += ceil($IncompleteTeam['1'] / 4);

echo $Cars . "\r\n";
?>

<?php
// $fp=fopen("a.txt", "r");
fscanf(STDIN, "%d", $n);
$groups=explode(" ", fgets(STDIN));

for ($i=0; $i < $n; $i++) $groups[$i]=(int)$groups[$i];

$count=0;
$arr=array_count_values($groups);

$count+=$arr[4];
if(!$arr[3]) $arr[3]=0;
if(!$arr[2]) $arr[2]=0;
if(!$arr[1]) $arr[1]=0;

if($arr[3]>$arr[1]){
	$count+=$arr[3]+ceil($arr[2]/2);
	echo $count;
	exit;
}

else if($arr[3]<$arr[1]){
	$count+=$arr[3];
	$arr[1]-=$arr[3];
}

else{
	$count+=$arr[3]+ceil($arr[2]/2);
	echo $count;
	exit;
}

$count+=ceil(($arr[2]*2+$arr[1])/4);
echo $count;
?>

<?php

$strParty = trim(fgets(STDIN));
$strCount = trim(fgets(STDIN));
$arrayCount = explode(" ",$strCount);
//$strParty = 100000;
//for($i = 0; $i < $strParty;$i++) $arrayCount[$i] = rand(1,4);

//if(!$arrayCount) exit(1);
//if(!$strParty) exit(1);
//if($strParty != count($arrayCount)) exit(1);

function first($arrayCount)
{

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 2) $arrayTwoDigits[] = $i;

for($i = 0; $i < count($arrayTwoDigits);$i++)
{
    if($arrayCount[$arrayTwoDigits[$i+1]])
     {
        if($arrayCount[$arrayTwoDigits[$i]] + $arrayCount[$arrayTwoDigits[$i+1]] == 4)
         {
            $arrayCount[$arrayTwoDigits[$i+1]] = 4;
            unset($arrayCount[$arrayTwoDigits[$i]]);
         }
     }

}

sort($arrayCount);
return $arrayCount;
}

function four($arrayCount)
{

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 1) $arrayTwoDigits2[] = $i;

for($i = 0; $i < count($arrayTwoDigits2);$i++)
{
    if($arrayCount[$arrayTwoDigits2[$i+1]])
     {
        if($arrayCount[$arrayTwoDigits2[$i]] + $arrayCount[$arrayTwoDigits2[$i+1]] == 2)
         {
            $arrayCount[$arrayTwoDigits2[$i+1]] = 2;
            unset($arrayCount[$arrayTwoDigits2[$i]]);
         }
     }

}

sort($arrayCount);
return $arrayCount;
}

function second($arrayCount)
{
for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 3) $arrayTwoDigits1[] = $i;

for($i = 0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i] == 1)
     {
        //$j = 0;
        if($arrayTwoDigits1[$i] != 0)
        {
        if($arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$i]] == 4)
         {
            $arrayCount[$arrayTwoDigits1[$i]] = $arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$i]];
            unset($arrayCount[$i]);

            //unset($arrayTwoDigits1[$i]);
            //sort($arrayTwoDigits1);
            //for($k = 0; $k <count($arrayTwoDigits1); $k++) $arrayTwoDigits1[$k] = $arrayTwoDigits1;
         }
         $arrayTwoDigits1[$i] = 0;
        }
      }

}
sort($arrayCount);
return $arrayCount;
}

$arrayCount = first($arrayCount);
//print_r($arrayCount);
$arrayCount = second($arrayCount);
//print_r($arrayCount);
$arrayCount = four($arrayCount);
$arrayCount = first($arrayCount);

for($i =0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i+1])
    {
     if($arrayCount[$i] + $arrayCount[$i+1] <=4 )
      {
        $arrayCount[$i+1] = $arrayCount[$i] + $arrayCount[$i+1];
        unset($arrayCount[$i]);
      }
    }

}
//sort($arrayCount);

// print_r($arrayCount);
$cCount = count($arrayCount);
print $cCount;

?>

<?php

$strParty = trim(fgets(STDIN));
$strCount = trim(fgets(STDIN));
$arrayCount = explode(" ",$strCount);
//$strParty = 100000;
//for($i = 0; $i < $strParty;$i++) $arrayCount[$i] = rand(1,4);

//if(!$arrayCount) exit(1);
//if(!$strParty) exit(1);
//if($strParty != count($arrayCount)) exit(1);

function first($arrayCount)
{

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 2) $arrayTwoDigits[] = $i;

for($i = 0; $i < count($arrayTwoDigits);$i++)
{
    if($arrayCount[$arrayTwoDigits[$i+1]])
     {
        if($arrayCount[$arrayTwoDigits[$i]] + $arrayCount[$arrayTwoDigits[$i+1]] == 4)
         {
            $arrayCount[$arrayTwoDigits[$i+1]] = 4;
            unset($arrayCount[$arrayTwoDigits[$i]]);
         }
     }

}

sort($arrayCount);
return $arrayCount;
}

function four($arrayCount)
{

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 1) $arrayTwoDigits2[] = $i;

for($i = 0; $i < count($arrayTwoDigits2);$i++)
{
    if($arrayCount[$arrayTwoDigits2[$i+1]])
     {
        if($arrayCount[$arrayTwoDigits2[$i]] + $arrayCount[$arrayTwoDigits2[$i+1]] == 2)
         {
            $arrayCount[$arrayTwoDigits2[$i+1]] = 2;
            unset($arrayCount[$arrayTwoDigits2[$i]]);
         }
     }

}

sort($arrayCount);
return $arrayCount;
}

function second($arrayCount)
{
for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 3) $arrayTwoDigits1[] = $i;

for($i = 0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i] == 1)
     {
        //$j = 0;
        if($arrayTwoDigits1[$i] != 0)
        {
        if($arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$i]] == 4)
         {
            $arrayCount[$arrayTwoDigits1[$i]] = $arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$i]];
            unset($arrayCount[$i]);

            //unset($arrayTwoDigits1[$i]);
            //sort($arrayTwoDigits1);
            //for($k = 0; $k <count($arrayTwoDigits1); $k++) $arrayTwoDigits1[$k] = $arrayTwoDigits1;
         }
         $arrayTwoDigits1[$i] = 0;
        }
      }

}
sort($arrayCount);
return $arrayCount;
}

$arrayCount = first($arrayCount);
//print_r($arrayCount);
$arrayCount = second($arrayCount);
//print_r($arrayCount);
$arrayCount = four($arrayCount);
$arrayCount = first($arrayCount);

for($i =0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i+1])
    {
     if($arrayCount[$i] + $arrayCount[$i+1] <=4 )
      {
        $arrayCount[$i+1] = $arrayCount[$i] + $arrayCount[$i+1];
        unset($arrayCount[$i]);
      }
    }

}
//sort($arrayCount);

//jghjjh

// print_r($arrayCount);
$cCount = count($arrayCount);
print $cCount;

?>

<?php

$fh = fopen('php://stdin','r');
$data = array();
while($s = fgets($fh)) {
    $data[] = $s;
}

$groupsSizes = explode(' ', $data[1]);
$groups = array(1 => 0, 2 => 0, 3 => 0, 4 => 0);
foreach ($groupsSizes as $size) {
    $groups[(int)$size]++;
}

$result = $groups[4] + $groups[3] + (int)($groups[2] / 2);
$groups[1] -= $groups[3];
if ($groups[2] % 2) {
    $result++;
    $groups[1] -= 2;
}
if ($groups[1] > 0) {
    $result += ceil($groups[1] / 4);
}

echo $result;

<?php
function read() {
    fscanf(STDIN, "%d", $n);
    $groups = explode(" ", trim(fgets(STDIN)));
    return $groups;
}

function get_sum($counts) {
    $sum = $counts[4] + $counts[3];
    $sum += ceil( (($counts[1] - $counts[3] > 0 ? $counts[1] - $counts[3] : 0)) / 4 + $counts[2] / 2);
    return $sum;
}

function get_counts($groups){

    $counts = array(0,0,0,0,0);
    foreach ($groups as $g) $counts[$g]++;

    return $counts;
}

$groups = read();
$counts = get_counts($groups);
$sum = get_sum($counts);

echo $sum;

<?php
$groups = trim(fgets(STDIN));
$line2 = trim(fgets(STDIN));
$res   =  explode(' ', $line2);

$d=0;$k=0;$s=0;$n=0;
foreach($res as $v)
{
    switch($v)
    {
        case 1:
            $d++;
            break;
        case 2:
            $s++;
            break;
        case 3:
            $k++;
            break;
        case 4:
            $n++;
            break;
    }
}
if($d<=$k)
    $last = $s%2;
else
{
    $m = ($s%2)*2 + ($d-$k);
    $last = (int) ($m/4);
    if($m%4 != 0)
        $last++;
}
$taxi = $n + $k + (int)($s/2) + $last;
fputs(STDOUT, $taxi);
?>

<?php
$n = trim(fgets(STDIN));
$group = explode(" ",fgets(STDIN));
$summary=0;
$start=0;$end=$n-1;
sort($group);
while (true)
{
    if ($end==$start)break;
    elseif (($group[$start]+$group[$end])>4)
    {
        $end--;
    }
    else
    {
        $group[$end]+=$group[$start];
        $start++;
        $n--;
        $summary++;
    }
}
    echo  $n;

?>

<?php
$str1 = trim(fgets(STDIN));
$str2 = explode(" ", trim(fgets(STDIN)));

$count = array_count_values($str2);
$res = 0;

while($count[3]>0){
    $count[3]--;
    if($count[1]>0) $count[1]--;
    $res++;
}
while($count[2]>1){
    $count[2]-=2;
    $res++;
}
while($count[1]>0){
    if($count[2]>0){
        $count[2]--;
        $count[1]-=2;
    }
    else
        $count[1]-=4;
    $res++;
}
if ($count[2]>0) $res++;

print($res+$count[4]);

<?php

getLine();
$ccnt = array(1 => 0, 0, 0, 0);

$groups = explode(' ', getLine());
foreach ($groups as $c) {
    $ccnt[$c]++;
}

$ccnt[1] -= $ccnt[3];
if ($ccnt[1]<0) $ccnt[1] = 0;

$tcnt = $ccnt[4] + $ccnt[3] + floor($ccnt[2]/2);

$ccnt[2] %= 2;
$ccnt[1] = $ccnt[1]-2*$ccnt[2];
if ($ccnt[1]<0) $ccnt[1] = 0;

$tcnt += $ccnt[2] + ceil($ccnt[1]/4);

echo $tcnt . PHP_EOL;

function getLine()
{
    return str_replace(array("\n", "\r"), array("", ""), fgets(STDIN));
}

<?php
error_reporting(0);
$h = fopen('php://stdin', 'r');

$groupsCounter = intval(trim(fgets($h)));

$holder = array();
$races  = 0;

for ($i = 0; $i < $groupsCounter; $i++) {
    $char = fgetc($h);
    $holder[$char]++;

    //space
    fgetc($h);
}
$races = $holder[4] + $holder[3] + ceil( (($holder[1] - $holder[3] > 0 ? $holder[1] - $holder[3] : 0)) / 4 + $holder[2] / 2 );

echo $races;

<?php
$n = trim(fgets(STDIN));
$input = fgets(STDIN);
$array = array_map('intval', explode(' ', $input));

$n1 = isset(array_count_values($array)["1"]) ? array_count_values($array)["1"] : 0 ;
$n2 = isset(array_count_values($array)["2"]) ? array_count_values($array)["2"] : 0 ;
$n3 = isset(array_count_values($array)["3"]) ? array_count_values($array)["3"] : 0 ;
$n4 = isset(array_count_values($array)["4"]) ? array_count_values($array)["4"] : 0 ;

if($n2 % 2 > 0){
	$need_2 = 1;
}else{
	$need_2 = 0;
}

if($n1 > $n3){
	$allow_1 = $n1-$n3;
}else{
	$allow_1 = 0;
}
if($allow_1 % 4 > 2 && $need_2 > 0){
	$ajuste = 1;
}else{
	$ajuste = 0;
}

$res = $n4 + $n3 + intval($n2/2) + $need_2 + intval($allow_1/4) + ($allow_1 % 4 > 0? 1 - $need_2 : 0) + $ajuste;
echo $res;
?>

<?php

fscanf(STDIN, "%d\n", $numGroups);

$groupLine = trim(fgets(STDIN));

$groupArr = explode(" ", $groupLine);

# first arrange by count
$ordered = array();
$ordered[0] = 0;
$ordered[1] = 0;
$ordered[2] = 0;
$ordered[3] = 0;
$ordered[4] = 0;

foreach ($groupArr as $groupSize) {
    $ordered[$groupSize]++;
}

$numCars = 0;

# these always need their own car
$numCars += $ordered[4];

# getting rid of all 1s
if ($ordered[3] > $ordered[1]) {
    # all 1s go with a 3, the rest of the 3s are on their own
    $numCars += $ordered[3];
    $ordered[1] = 0;
    $ordered[3] = 0;
    $numCars += ceil($ordered[2] / 2);
    $ordered[2] = 0;
}
else if ($ordered[1] > $ordered[3]){
    # getting rid of all 3s
    $numCars += $ordered[3];
    $ordered[1] -= $ordered[3];
    $numCars += floor($ordered[2] / 2);

    if ($ordered[2] % 2) {
        # there is 1 group that can't be paired
        if ($ordered[1] <= 2){
            $ordered[1] = 0;
        }
        else {
            $ordered[1] -= 2;
        }
        $ordered[2] = 0;
        $numCars++;
    }

    $numCars += ceil($ordered[1] / 4);
}
else {
    # 3s and 1s cancel each other out
    $numCars += $ordered[3];
    $ordered[1] = 0;
    $ordered[3] = 0;
    $numCars += ceil($ordered[2] / 2);
    $ordered[2] = 0;
}

echo $numCars;

?>

<?php
//set_time_limit(10);
/**
 * @author icyken
 * @copyright 2012
 */

$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');

//$stdin = fopen("input.txt",'r');

$inputFirstLine     = explode(" ",trim(fgets($stdin)));
$values             = explode(" ",trim(fgets($stdin)));
rsort($values);

$n = $inputFirstLine[0];
$i_a = 0;
$i_e = $n-1;
$count = 0;
$lc = 0;
while ($i_a<=$i_e)
{
    if ($lc==0)
    {
        $lc = $values[$i_a];
        $i_a++;
    }

    if ($lc+$values[$i_e]<5)
    {
        $lc = $lc + $values[$i_e];
        $i_e--;
    } else
    {
        $lc = 0;
        $count++;
        continue;
    }
}

if ($lc>0) $count++;

    echo $count;
?>

<?php
$group = fgets(STDIN);
$group = fgets(STDIN);
$group = explode(' ', rtrim($group));
$group = array_count_values($group);
if(!isset($group[1])) $group[1] = 0;
if(!isset($group[2])) $group[2] = 0;
if(!isset($group[3])) $group[3] = 0;
if(!isset($group[4])) $group[4] = 0;

$taxi += $group[4];
$taxi += $group[3];
$group[1] -= $group[3];
$taxi += $group[2] / 2;
if($group[1] > 0){
 $taxi += $group[1] / 4;
}

echo ceil($taxi);

?>

<?php
	$_1 = fgets(STDIN);
	$_1 = fgets(STDIN);
	$s = explode(' ', rtrim($_1));
	$four = count(array_diff($s, array(1, 2, 3)));
	$two_first = count(array_diff($s, array(1, 3, 4)));
	if (($two_first % 2) == 0) {
		$two = ($two_first / 2);
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			if ($three_first > $one_first) {
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}
		if ($one_first == 0 && $three_first == 0) $one_and_three = 0;
		$answer = $four + $two + $one_and_three;
		echo $answer;
	} else {
		$two = floor($two_first / 2);
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			if (($one_first % 2) != 0) $two = 0;
			if ($one_first == 1) $two = 1;
			if ($one_first <= 2 && $three_first < 1) {
				$answer = $four + $two;
			} else {
				$answer = $four + $two + $one_and_three;
			}
			echo $answer;
		} else {
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2) + 1;
				$answer = $four + $two + $one_and_three;
				echo $answer;
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					if ($b <= 0.5) {
						$b = 1;
					} else {
						$b = 2;
					}
					$one_and_three = ($three_first + $a + $b);
				}
				$answer = $four + $two + $one_and_three;
				echo $answer;
			}
		}
	}
?>

<?php
	// Спрашиваем данные
	$_1 = fgets(STDIN);
	$_1 = fgets(STDIN);

	// Создаем массив с данными
	$s = explode(' ', rtrim($_1));

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам не нужны.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if (($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}
		if ($one_first == 0 && $three_first == 0) $one_and_three = 0;

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			if (($one_first % 2) != 0) $two = 0;
			if ($one_first == 1) $two = 1;
			if ($one_first <= 2 && $three_first < 1) {
				$answer = $four + $two;
			} else {
				$answer = $four + $two + $one_and_three;
			}

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>

<?php
/**
 * Created by IntelliJ IDEA.
 * User: 低调的程序员
 * Date: 2015/4/25
 * Time: 1:17
 */

while(fscanf(STDIN,"%d",$n)){
    $line=stream_get_line(STDIN,655350,"\n");
    $arr=explode(" ",$line);
    $ret=array(0,0,0,0);
    foreach($arr as $o){
        $ret[$o-1]++;
    }
    $ans=$ret[3];//4人小组
//    fprintf(STDOUT,"%d\n",$ans);
    //3人小组和1人小组
    if($ret[2]>=$ret[0]){
        $ans+=$ret[2];
        $ret[0]=0;
    }
    else{
        $ans+=$ret[2];
        $ret[0]-=$ret[2];
    }
//    fprintf(STDOUT,"%d\n",$ans);
    $ans+=floor($ret[1]/2);//两人组
    $ret[1]%=2;
//    fprintf(STDOUT,"%d\n",$ans);
    //剩余两人组和剩余一人组
    if($ret[1]>0){
        $ans++;
        if($ret[0]>0){
            $ret[0]-=2;
        }
    }
//    fprintf(STDOUT,"%d\n",$ans);
    //剩余一人组
    if($ret[0]>0){
        $ans+=floor(($ret[0]-1)/4);
        $ans++;
    }

    fprintf(STDOUT,"%d\n",$ans);
}

<?php
// 158B 	Такси

$in = fopen("php://stdin", 'r');

$input_line = fgets($in);
$n = (int) $input_line;

$c1 = $c2 = $c3 = $c4 = $i = 0;

while (false !== ($value = fgetc($in))) {
    $i++;
//    echo "$value\n";
    switch ($value) {
        case '1':
            $c1++;
            break;
        case '2':
            $c2++;
            break;
        case '3':
            $c3++;
            break;
        case '4':
            $c4++;
            break;
        default:
            break;
    }
    $value = fgetc($in);

    if ($i == $n) {
        break;
    }
}

$out = $c4 +$c3;

if ($c1 >= $c3) {
    $c1 -= $c3;
} else {
    $c1 = 0;
}

if (($c2 % 2) == 0) {
    $out += $c2/2;
} else {
    $out += intval($c2/2);
    $c1 += 2;
}

$out += ceil($c1/4);

echo $out;

?>

<?php

class Solution
{
    protected function calc($one, $two, $three, $four)
    {
        if ($four) {
            return $this->calc($one, $two, $three, 0) + $four;
        }

        if ($one && $three) {
            $min = min($one, $three);
            return $this->calc($one - $min, $two, $three - $min, 0) + $min;
        }

        if ($three) {
            return $this->calc(0, $two, 0, 0) + $three;
        }

        if ($two) {
            return $this->calc($one + 2 * ($two % 2), 0, 0, 0) + intval($two / 2);
        }

        return intval($one / 4) + ($one % 4 != 0);
    }

    public function solve()
    {
        fscanf(STDIN, '%d', $n);
        $count = array_count_values(explode(' ', trim(fgets(STDIN)))) + ['1' => 0, '2' => 0, '3' => 0, '4' => 0];
        echo $this->calc($count['1'], $count['2'], $count['3'], $count['4']) . PHP_EOL;
    }
}

$sol = new Solution();
$sol->solve();

<?php
$file = file('php://stdin');
$n = intval($file[0]);
$s = array_count_values(explode(' ',trim($file[1])));
$count = $s[4];
$min_threes= min($s[3], $s[1]);
$count += $min_threes;
$s[3] -= $min_threes; $s[1] -= $min_threes;
$count += $s[3];
$cars = floor($s[2]/2);
$s[2] -= $cars*2;
$count += $cars;
if ($s[2] == 1) {
    $count += 1;
    $s[1] -= 2;
}
$count += ceil($s[1]/4);
echo $count;
?>

<?php
$cntInput = fgets(STDIN);
$arInput =  explode(' ',trim(fgets(STDIN)));
for($i=0;$i<$cntInput;$i++)
    $res[$arInput[$i]]++;

$totalcount = $res[4] + $res[3] + floor($res[2] / 2);

$e1_rem = ($res[1] - $res[3]) > 0 ? ($res[1] - $res[3]) : 0;
if (($res[2] % 2) == 1) {
    $e1_rem = (($e1_rem - 2) > 0) ? ($e1_rem - 2) : 0;
    $totalcount += 1;
}

if ($e1_rem > 0)
    $totalcount += floor($e1_rem / 4);

if (($e1_rem % 4) > 0)
    $totalcount += 1;

echo $totalcount;

?>

<?php

error_reporting(0);

$stdin = fopen("php://stdin", "r");
$line1 = trim(fgets($stdin));
$line2 = trim(fgets($stdin));

$n = $line1;
$s = explode(' ', $line2);

//$s = array(3,3,3,3, 2,2,2,2,2, 1,1,1,1, 1,1, 1,1,1,1,1,1,1,1,1);
//$n = count($s);

$digits = array("one" => 0, "two" => 0, "three" => 0, "four" => 0);

for($i = 0; $i < $n; $i++) {
    if($s[$i] == 1)$digits["one"]++;
    if($s[$i] == 2)$digits["two"]++;
    if($s[$i] == 3)$digits["three"]++;
    if($s[$i] == 4)$digits["four"]++;
}

$ones = $digits["one"];
$twos = $digits["two"];
$threes = $digits["three"];
$fours = $digits["four"];

$taxis = 0;

for($i = 0; $i < $fours; $i++) {
    $digits["four"]--;
    $taxis++;
}

for($i = 0; $i < $threes; $i++) {
    if($digits["three"] >= 1) {
        if($digits["one"] >= 1) {
            $digits["three"]--;
            $digits["one"]--;
            $taxis++;
        }
        else {
            $digits["three"]--;
            $taxis++;
        }
    }
    else{break;}
}

$ones = $digits["one"];
$twos = $digits["two"];
$threes = $digits["three"];
$fours = $digits["four"];

for($i = 0; $i < $twos; $i++) {
    if($digits["two"] >= 1) {
        if($digits["two"] >= 2) {
            $digits["two"]--;
            $digits["two"]--;
            $taxis++;
        }
        elseif($digits["one"] >= 1) {
            if($digits["one"] >= 2) {
                $digits["one"]--;
                $digits["one"]--;
            }
            elseif($digits["one"] >= 1) {
                $digits["one"]--;
            }
            $digits["two"]--;
            $taxis++;
        }
        elseif($digits["two"] == 1) {
            $digits["two"]--;
            $taxis++;
        }
        else {}
    }
    else {break;}
}

$ones = $digits["one"];
$twos = $digits["two"];
$threes = $digits["three"];
$fours = $digits["four"];

for($i = 0; $i < $ones; $i++) {
    if($digits["one"] >= 4) {
        $digits["one"] -= 4;
        $taxis++;
    }
    elseif($digits["one"] == 3) {
        $digits["one"] -= 3;
        $taxis++;
    }
    elseif($digits["one"] == 2) {
        $digits["one"] -= 2;
        $taxis++;
    }
    elseif($digits["one"] == 1) {
        $digits["one"] -= 1;
        $taxis++;
    }
    else {break;}
}

echo $taxis;

?>

<?php

$input = fgets(STDIN);
$input = fgets(STDIN);
$numbers = explode(' ', rtrim($input));

$groups = array_count_values($numbers);

if (!isset($groups[4])) $groups[4] = 0;
if (!isset($groups[3])) $groups[3] = 0;
if (!isset($groups[2])) $groups[2] = 0;
if (!isset($groups[1])) $groups[1] = 0;

$answer = $groups[4];

$answer += $groups[3];
$groups[1] -= $groups[3];

$answer += (int)($groups[2] / 2);
if ($groups[2]% 2 == 1) {
    $answer += 1;
    $groups[1] -= 2;
}

if ($groups[1] > 0) {
    $answer += ceil($groups[1] / 4);
}

echo $answer . PHP_EOL;

<?php
        //Enter your code here, enjoy!
$n =  trim(fgets(STDIN)); // we don't care about this.
$groups = explode(" ", trim(fgets(STDIN)));

$taxis = 0;
$hash = [];

foreach($groups as $g) {
    $comp = 4 - $g;

    if(isset($hash[$comp])) {
        $hash[$comp]--;
        if($hash[$comp] == 0) {
            unset($hash[$comp]);
        }

        continue;
    }

    $taxis++;
    $hash[$g] = (isset($hash[$g])) ? $hash[$g] + 1 : 1;
}

// collapse
if(isset($hash[1])) {
    $hash[1] += isset($hash[2]) ? 2 : 0;
    $taxis -= ($hash[1] - (isset($hash[2])));
    $taxis += ceil($hash[1] / 4);
}

echo $taxis;

<?php

fscanf(STDIN, '%d\n', $n);	// считываем кол-во групп школьников

$line = fgets(STDIN);				// считываем группы школьников как строку
$groups = explode(' ', $line);	// теперь groups - это массив чисел

$groupOfOne = 0;
$groupOfTwo = 0;
$groupOfThree = 0;
$groupOfFour = 0;

for($i = 0; $i < count($groups); ++$i) {
	$groups[$i] = (int)$groups[$i];
	if($groups[$i] == 1) {
		$groupOfOne += 1;
	}
	if($groups[$i] == 2) {
		$groupOfTwo += 1;
	}
	if($groups[$i] == 3) {
		$groupOfThree += 1;
	}
	if($groups[$i] == 4) {
		$groupOfFour += 1;
	}
}

// all 4
$taxi = 0;
$taxi += $groupOfFour;

// 3 + 1
$min = min($groupOfThree, $groupOfOne);
$taxi += $min;
$groupOfThree -= $min;
$groupOfOne -= $min;

// all 3
$taxi += $groupOfThree;

// 2
$taxi += floor($groupOfTwo / 2);
$groupOfTwo = $groupOfTwo % 2;

// all 2 + 1
$fancyCar = 0;
$fancyCar = $groupOfTwo * 2;

while($groupOfOne > 0 && $fancyCar < 4) {
	$fancyCar += 1;
	$groupOfOne -= 1;
}

if($fancyCar > 0) {
	$taxi += 1;
}

// all 1
$taxi += ceil($groupOfOne / 4);

printf($taxi);

<?php

fscanf(STDIN, '%d\n', $n);	// считываем кол-во групп школьников

$line = fgets(STDIN);				// считываем группы школьников как строку
$groups = explode(' ', $line);	// теперь groups - это массив чисел

$groupCount = array();
for($i = 0; $i < count($groups); ++$i) {
	$groups[$i] = (int)$groups[$i];
	if(!isset($groupCount[$groups[$i]])) {
		$groupCount[$groups[$i]] = 0;
	}
	$groupCount[$groups[$i]] += 1;
}

// all 4
$taxi = 0;
if (isset($groupCount[4])) {
	$taxi += $groupCount[4];
}

// 3 + 1
if (isset($groupCount[3]) && isset($groupCount[1])) {
	$min = min($groupCount[3], $groupCount[1]);
	$taxi += $min;
	$groupCount[3] -= $min;
	$groupCount[1] -= $min;
}

// all 3
if (isset($groupCount[3])) {
	$taxi += $groupCount[3];
}

// 2
if (isset($groupCount[2])) {
	$taxi += floor($groupCount[2] / 2);
	$groupCount[2] = $groupCount[2] % 2;
}

// all 2 + 1
$fancyCar = 0;
if (isset($groupCount[2])) {
	$fancyCar = $groupCount[2] * 2;
}
if (isset($groupCount[1])) {
	while($groupCount[1] > 0 && $fancyCar < 4) {
		$fancyCar += 1;
		$groupCount[1] -= 1;
	}
}

if($fancyCar > 0) {
	$taxi += 1;
}

// all 1
if (isset($groupCount[1])) {
	$taxi += ceil($groupCount[1] / 4);
}

printf($taxi);

<?php
fscanf(STDIN, '%d', $n);
$groups = fgets(STDIN);
$groups = explode(' ', trim($groups));

sort($groups);
$taxiCount = 0;
$poz = 0;
for ($i = $n - 1; $i >= $poz; --$i) {
    $sum = $groups[$i];
    while( $poz < $i ) {
        if ( $sum + $groups[$poz] <= 4 ) {
            $sum += $groups[$poz++];
        }
        else break;
    }
   $taxiCount++;
}

echo $taxiCount;

<?php

/**
 * @author Sunwaurl
 * Problem: Codeforces B. Taxi
 * Solution By: PHP Language
 */

error_reporting(0);
$temp = $total = 0;
$count1 = $count2 = $count3 = 0;

$n = (int) fgets(STDIN);
$g = [];
$g = array_map('intval', explode(' ', fgets(STDIN)));

for($i=0; $i<$n; $i++) {
    if($n == 1) {
        $total++;
        break;
    }

    if($g[$i] == 1) $count1++;
    else if($g[$i] == 2) $count2++;
    else if($g[$i] == 3) {
        $count3++;
        $total++;
    } else {
        $total++;
    }
}
    $count2 = $count2 * 2;
    $total += $count2 / 4;
    $left = $count2 % 4;
    if($count3 >= $count1) {
        $count1 = 0;
    } else {
        $count1 = $count1 - $count3;
    }

    $temp = $left + $count1;

    while($temp > 0) {
        $total++;
        $temp = $temp - 4;
    }
echo (int) $total."\n";

<?php
$group = fgets(STDIN);
$group = fgets(STDIN);
$group = explode(' ', rtrim($group));
$group = array_count_values($group);
if(!isset($group[1])) $group[1] = 0;
if(!isset($group[2])) $group[2] = 0;
if(!isset($group[3])) $group[3] = 0;
if(!isset($group[4])) $group[4] = 0;

$taxi += $group[4];
$taxi += $group[3];
$group[1] -= $group[3];
$taxi += $group[2] / 2;
if($group[1] > 0){
	$taxi += $group[1] / 4;
}

echo ceil($taxi);

<?php
fscanf(STDIN, "%d\n", $iGroupsCount);

if ($iGroupsCount > 100000 || $iGroupsCount < 1) {
	die;
}

$sGroups = fgets(STDIN);
$aGroups = explode(' ', $sGroups);

foreach ($aGroups as & $iGroup) {
	$iGroup = (int) $iGroup;
}

unset($iGroup);

if (count($aGroups) != $iGroupsCount) {
	die;
}

$aGrouped = array_count_values($aGroups);

if (key_exists(0, $aGrouped)) {
	die;
}

for ($i = 1; $i <= 4; $i ++) {
	if (!key_exists($i, $aGrouped)) {
		$aGrouped[$i] = 0;
	}
}

$iTaxies = $aGrouped[4] + $aGrouped[3] + ceil($aGrouped[2] / 2);

$iSlots = $aGrouped[1] - $aGrouped[3] - ($aGrouped[2] % 2 == 0 ? 0 : 2);

if ($iSlots > 0) {
	$iTaxies += ceil($iSlots / 4);
}

echo $iTaxies;

<?
$fp=fopen('php://stdin', 'r');
$lines=stream_get_contents($fp);

$lines=trim($lines);
$lines=explode("\n", $lines);

$cars=0;
$people_in_groups=array(1=>0,2=>0,3=>0,4=>0);

$n=trim($lines[0]);
$groups=explode(" ", trim($lines[1]));
foreach ($groups as $count)
    $people_in_groups[$count]++;
//print_r($people_in_groups);

//Перебираем группы, где  человека - и каждую в машину;
$tmp=$people_in_groups[4];
$cars+=$tmp;
unset($people_in_groups[4]);

//Запихиваем в тачки группы по 3 человека и по 1 человеку - в 1 машину
$tmp=min($people_in_groups[3], $people_in_groups[1]);
$people_in_groups[3]=$people_in_groups[3]-$tmp;
$people_in_groups[1]=$people_in_groups[1]-$tmp;
$cars+=$tmp;
$cars+=$people_in_groups[3];
unset($people_in_groups[3]);

//Запихиваем в каждую тачку группы по 2 человека. Если их четное количество - влезут ровно в тачки. Нечетное - надо будет дополнять

//Групп по 2 было четное количество. Их все вместили в тачки, их больше нет
if ($people_in_groups[2]%2==0)
{
    $tmp=$people_in_groups[2]/2;
    $cars+=$tmp;
    unset($people_in_groups[2]);
}
if ($people_in_groups[2]%2==1)
{
    $tmp=ceil($people_in_groups[2]/2);  //В тачке осталось 2 места под группы по 1 человеку
    unset($people_in_groups[2]);
    $cars+=$tmp;

    $tmp=min(2, $people_in_groups[1]);
    $people_in_groups[1]=$people_in_groups[1]-$tmp;
}

$tmp=ceil($people_in_groups[1]/4);
$cars+=$tmp;
echo $cars;
?>

<?php
$f = fopen('php://stdin', 'r');
$input1 = fgets($f);
$input2 = fgets($f);

//разобьем группы на массивы по количеству
foreach (explode(" ", $input2) as $k)
	$groups[(int)$k]++;

//посадили группы по 4 человека
$out = $groups[4];

$min_threes = min($groups[3], $groups[1]);

//посадили группы 3+1 человек
$out += $min_threes;
$groups[3] -= $min_threes; $groups[1] -= $min_threes;

//посадили оставшихся по три человека
$out += $groups[3];

$cars = floor($groups[2]/2);
$groups[2] -= $cars*2;

//посадили в машины вместе группы по два человека
$out += $cars;

if ($groups[2] == 1) {
	$out += 1;
	$groups[1] -= 2;
}

$out += ceil($groups[1]/4);

echo $out;

?>

<?php
//error_reporting(0);
$dir = fopen("php://stdin", 'r');
$num_groups = fgets($dir);
$num_people = fgets($dir);
$num_people_in_group = explode(" ", $num_people);
$taxi = 0;
$max = intval(max($num_people_in_group));
$min =  intval(min($num_people_in_group));
if ($max== $min) {
	if ($max==4 or $max==3) {
		$taxi=$num_groups;
	}else{
	if (($num_groups % 4)==0) {
		$taxi = ($num_groups * $min)/4;
	}else{
		$taxi = intval(($num_groups * $min)/4)+1;
	}
}

}else{
sort($num_people_in_group);
for ($a=0; $a < $num_groups ; $a++) {
	$value = $num_people_in_group[$a];
		for ($i=$num_groups-1; $i >=0 ; $i--) {
			if ($a!=$i) {
				$maxval=$num_people_in_group[$i];
				if ($maxval==4) {
					$num_people_in_group[$i]=0;
					$taxi+=1;
					continue;
				}elseif ($maxval==0) {
					continue;
				}elseif (($value+$maxval)==4 ) {
					$num_people_in_group[$i]=0;
					$num_people_in_group[$a]=0;
					$taxi+=1;
					break;
				}elseif (($value+$maxval)<4 and $i!=$a) {
					$num_people_in_group[$i]+=$value;
					$num_people_in_group[$a]=0;
					break;
				}/*elseif (($value+$maxval)>4 and $i!=$a) {
					//$taxi+=2;
					break;
				}*/
			}else{
				break;
			}
		}
	if ($a == $i) {
	break;
	}
}

foreach ($num_people_in_group as  $value) {
	if ($value>0) {
		$taxi+=1;
	}
}
}
echo $taxi;

?>

<?php
error_reporting(0);
#echo "string";
$dir = fopen("php://stdin", 'r');
//echo stream_get_contents($dir);
$num_groups = fgets($dir);
$num_people = fgets($dir);
$num_people_in_group = explode(" ", $num_people);
//echo $a+$b;
#print_r($num_people_in_group);
//arsort($num_people_in_group);
for ($i=0; $i < $num_groups; $i++) {
	foreach ($num_people_in_group as $key => $group_num) {
	if ($group_num==0 or $group_num==4) {
		break;
	}elseif ($group_num<4 ) {
		$current_group_num = $group_num;
		$current_key = $key;
		foreach ($num_people_in_group as $key => $group_num) {
			if ($current_group_num+$group_num<=4 and  $current_key != $key) {
				$num_people_in_group[$key]= 0;
				$num_people_in_group[$current_key]= $current_group_num+$group_num;
				$num_groups-=1;
			}
		}
	}
}

}

foreach ($num_people_in_group as $key => $value) {
	if ($value!=0) {
		$x+=1;
	}
}
echo $x;
//echo "====================";
//print_r($num_people_in_group);
?>

<?php
$groups_count = fgets(STDIN);
$groups_count = explode(' ', $groups_count);
$groups = array_count_values($groups_count);
if(!isset($groups[4])) $groups[4] = 0;
if(!isset($groups[3])) $groups[3] = 0;
if(!isset($groups[2])) $groups[2] = 0;
if(!isset($groups[1])) $groups[1] = 0;
$taxi = $groups[4];
$taxi += $groups[3];
$groups[1] -= $groups[3];
$taxi += $groups[2] / 2;
if($groups[1] > 0){
	$taxi += ceil($groups[1] / 4);
}
echo ceil($taxi);
?>

<?php
$str1 = trim(fgets(STDIN));
$str2 = explode(" ", trim(fgets(STDIN)));

$i = 1;
while ($i < $str1) {
    $i++;
    if (in_array(3, $str2) && in_array(1, $str2)) {
        $str2[] = 4;
        $key1 = array_search(3, $str2);
        unset($str2[$key1]);
        $key2 = array_search(1, $str2);
        unset($str2[$key2]);
    }
    elseif (in_array(2, $str2) && in_array(2, $str2)) {
        $str2[] = 4;
        $key3 = array_search(2, $str2);
        unset($str2[$key3]);

        $key4 = array_search(2, $str2);
        unset($str2[$key4]);
    }
}
echo count($str2);

<?php
fscanf(STDIN, "%d", $n);
$groups = explode(" ", trim(fgets(STDIN)));

$mem = array_sum($groups);
$count_car = ($mem<4) ? 1 : ($mem%4)?(int) ($mem/4) + 1: $mem/4;

echo $count_car;
?>

<?php
function read() {
	fscanf(STDIN, "%d", $n);
	$groups = explode(" ", trim(fgets(STDIN)));
	return $groups;
}

function get_sum($counts) {
	$sum = $counts[4];
	if ($counts[3] - $counts[1] >= 0) {
		$sum += $counts[3] + ceil($counts[2] / 2);
	} else {
		$rest_ones = $count[1] - $count[3];
		$sum += $counts[3] + floor($count[2] / 2);

		if ($count[2] % 2  - $rest_ones >= 0) {
			$sum += ($counts[2] % 2 == 0) ? 0 : 1;
		} else {
			$rest_ones = $rest_ones - $counts[2] % 2;
			$sum += floor($rest_ones / 4) + ($rest_ones % 4 == 0 ? 0 : 1);
		}
	}

	return $sum;
}

function get_counts($groups){

	$counts = array(0,0,0,0,0);
	foreach ($groups as $g) $counts[$g]++;

	return $counts;
}

$groups = read();
$counts = get_counts($groups);
$sum = get_sum($counts);

echo $sum;

<?php
	$total = 0;
	$list_1 = 0;
	$list_2 = 0;
	$list_3 = 0;
	$list_4 = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	foreach ($list as $val) {
		if ($val == 1) $list_1++;
		elseif ($val == 2) $list_2++;
		elseif ($val == 3) $list_3++;
		elseif ($val == 4) $list_4++;
	}
	// single 4
	$total = $list_4;
	// combination 1 3
	$min = min($list_1,$list_3);
	$list_1 -= $min;
	$list_3 -= $min;
	$total += $min;
	// single 3
	$total += $list_3;
	// double 2
	$total += floor($list_2 / 2);
	// combination 1 1 2
	$min = min(floor($list_1/2),$list_2);
	$list_1 -= 2*$min;
	$list_2 -= $min;
	$total += $min;
	// combination 1 2
	$min = min($list_1,$list_2);
	$list_1 -= $min;
	$list_2 -= $min;
	$total += $min;
	// single 2
	$total += $list_2;
	// combination 1
	$total += ceil($list_1 / 4);
    echo $total;
	/*
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	rsort($list);
	while (count($list) > 0) {
		while (count($list) > 1) {
            if ($list[0] + $list[count($list)-1] <= 4) {
                $list[0] += $list[count($list)-1];
                unset($list[count($list)-1]);
                $list = array_values($list);
            } else {
                break;
            }
        }
		unset($list[0]);
        $list = array_values($list);
		$total++;
	}
	echo $total;
	*/

<?php
$group = fopen('php://stdin', 'r');
$group = explode(' ', $group);
$group = array_count_values($group);
if(!isset($group[1])) $group[1] = 0;
if(!isset($group[2])) $group[2] = 0;
if(!isset($group[3])) $group[3] = 0;
if(!isset($group[4])) $group[4] = 0;

$taxi += $group[4];
$taxi += $group[3];
$group[1] -= $group[3];
$taxi += $group[2] / 2;
if($group[1] > 0){
	$taxi += $group[1] / 4;
}

echo ceil($taxi);

<?php
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	for ($x = 0; $x < count($list); $x++) {
		$list[$x] = (int)$list[$x];
	}
	rsort($list);
	while (count($list) > 0) {
		if (count($list) > 1) {
			while (count($list) > 1) {
                if ($list[0] == 4) {
	                unset($list[0]);
                    rsort($list);
                    break;
                } elseif ($list[0] + $list[count($list)-1] <= 4) {
                    unset($list[0]);
                    unset($list[count($list)-1]);
                    rsort($list);
                } else {
                    break;
                }
            }
		} else {
			unset($list[0]);
			rsort($list);
		}
		$total++;
	}
	echo $total;

<?php
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	for ($x = 0; $x < count($list); $x++) {
		$list[$x] = (int)$list[$x];
	}
	rsort($list);
	foreach ($list as $key=>$val) {
		if (count($list) > 0) {
			if ($val + $list[count($list)-1] <= 4) {
				unset($list[count($list)-1]);
			}
		}
		$total++;
		unset($list[$key]);
	}
	echo $total;

<?php
error_reporting(0);
$h = fopen('php://stdin', 'r');

$groupsCounter = intval(trim(fgets($h)));

$holder = 0;
$races  = 0;

for ($i = 0; $i < $groupsCounter; $i++) {
    $char = intval(fgetc($h));
    $holder[$char]++;

    //space
    fgetc($h);
}
echo ($holder[4] + ceil( abs($holder[1] - $holder[3]) / 4 + $holder[2] / 2 ));

<?php
$n = trim(fgets(STDIN));
$s = explode(' ', trim(fgets(STDIN)));
rsort($s);
$taxi = 0;
$last = 0;
for ($i=0;$i<$n;$i++){
    if ($last + $s[$i] < 4)
        $last += $s[$i];
    else{
        $taxi++;
        $last = $s[$i];
    }
}

print $taxi;
?>

<?php
fscanf(STDIN, "%d", $n);
$groups = explode(" ", trim(fgets(STDIN)));

$mem = array_sum($groups);
$count_car = ($mem<4) ? 1 : (int) ($mem/4) + $mem%4;

echo $count_car;
?>

<?php
$file = file('php://stdin');
$n = intval($file[0]);
$s = explode(' ',trim($file[1]));
sort($s);
for ($i = 0; $i < $n; $i++)
{
    if (max($s) == 4) {$key = array_search(4, $s); unset($s[$key]); $count++;}
    if (($s[0]+max($s))<=4) { $s[0]=$s[0]+array_pop($s);  sort($s);}
}
if(isset($s[0])) { $count = $count + ceil(array_sum ($s)/4);}
echo $count;

?>

<?php
$input1 = "8";
$input2 = "2 3 4 4 2 1 3 1";

//разобьем группы на массивы по количеству
foreach (explode(" ", $input2) as $k)
	$groups[$k]++;

//посадили группы по 4 человека
$out = $groups[4];

$min_threes = min($groups[3], $groups[1]);

//посадили группы 3+1 человек
$out += $min_threes;
$groups[3] -= $min_threes; $groups[1] -= $min_threes;

//посадили оставшихся по три человека
$out += $groups[3];

$cars = floor($groups[2]/2);
$groups[2] -= $cars*2;

//посадили в машины вместе группы по два человека
$out += $cars;

if ($groups[2] == 1) {
	$out += 1;
	$groups[1] -= 2;
}

$out += ceil($groups[1]/4);

echo $out;

<?php
$str1 = trim(fgets(STDIN));
$str2 = explode(" ", trim(fgets(STDIN)));
//echo ceil(array_sum($str2)/4);
$cnt = $cnt1 = $cnt2 = $cnt3 = $cnt4= 0;
for($i=1;$i<=$str1;$i++){
    switch ($str2[$i]){
        case '4': $cnt4++;break;
        case '3': $cnt3++;break;
        case '2': $cnt2++;break;
        case '1': $cnt1++;break;
    }
}
$cnt=$cnt4;
if($cnt3 >= $cnt1){
	$cnt = $cnt + $cnt1;
	$cnt3 = $cnt3 - $cnt1;
	$cnt1 = 0;
}
elseif($cnt3 < $cnt1){
	$cnt = $cnt + $cnt3;
	$cnt1 = $cnt1 - $cnt3;
	$cnt3 =  0;
}
$cnt = $cnt + ($cnt2/2);
$cnt2 = $cnt2%2;

if($cnt3 > 0){
	$cnt = $cnt + $cnt3 + $cnt2;
}
elseif($cnt2==1 && $cnt1==0 && $cnt3==0) {
	$cnt++;
}elseif($cnt1>0){
	if($cnt2>0){
		$cnt++;
		$cnt1=$cnt1-2;
		$cnt2=0;
	}
	if($cnt1>0){
		$cnt=$cnt+($cnt1/4);
		if($cnt1%4!=0){
			$cnt++;
		}
	}

}
echo count($cnt);

<?php
fscanf(STDIN, "%d", $n);
$groups = explode(" ", trim(fgets(STDIN)));

sort($groups);
$place=4;
$count=0;

for ($i=0; $i < $n; $i++) {
	if ($place<$groups[$i]){
		$place=4;
		$count++;
	}
	$place-=$groups[$i];
}

echo $count;
?>

<?php
	// Спрашиваем у юзера данные
	$_1 = fgets(STDIN);
	$_2 = fgets(STDIN);

	// Создаем массив с данными
	$s = explode (" ", $_2);

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам НАХУЙ НЕ НУЖНЫ.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if(($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			$answer = $four + $two + $one_and_three;

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>

<?php
$num_group = trim(fgets(STDIN));
$str = trim(fgets(STDIN));
$taxi = 0;
$arr_penumpang = explode(" ",$str);
$count = array_count_values($arr_penumpang);

while($count[4]>0)
{
	$count[4] = $count[4] - 1;
	$taxi = $taxi + 1;
}
while($count[3]>0)
{
	$count[3] = $count[3] - 1;
	if($count[1]>0)
	{
		$count[1] = $count[1] - 1;
	}
	$taxi = $taxi + 1;
}
while($count[2]>1)
{
	$count[2] = $count[2] - 2;
	$taxi = $taxi + 1;
}
while($count[1]>0)
{
	if($count[2]>0){
		$count[2] = $count[2] - 2;
	}
	else
	{
		$count[1] = $count[1] - 4;
	}
	$taxi = $taxi + 1;
}
if($count[2]>0)
	$taxi = $taxi + 1;
echo $taxi;
?>

<?php
	$total = 0;
	$list_1 = 0;
	$list_2 = 0;
	$list_3 = 0;
	$list_4 = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	foreach ($list as $val) {
		if ($val == 1) $list_1++;
		elseif ($val == 2) $list_2++;
		elseif ($val == 3) $list_3++;
		elseif ($val == 4) $list_4++;
	}
	$total = $list_4;
	$total += ceil($list_2 / 2);
	$min = min($list_1,$list_3);
	$total += $min;
	$list_1 -= $min;
	$list_3 -= $min;
	$total += $list_1;
	$total += $list_3;
    echo $total;
	/*
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	rsort($list);
	while (count($list) > 0) {
		while (count($list) > 1) {
            if ($list[0] + $list[count($list)-1] <= 4) {
                $list[0] += $list[count($list)-1];
                unset($list[count($list)-1]);
                $list = array_values($list);
            } else {
                break;
            }
        }
		unset($list[0]);
        $list = array_values($list);
		$total++;
	}
	echo $total;
	*/

<?php
$n = trim(fgets(STDIN));
$s = explode(" ", trim(fgets(STDIN))) ;
$i = 0;
$j=0;
$total=0;

while ($i <= count($s)) {
	if($j+$s[$i] > 4){
		$total++;
		$j=0;
	}
	$j=$j+$s[$i];
	$i++;
}

if($j == 0){
	echo $total;
}
else{
	echo $total=$total+1;
}

?>

<?php
//$file = file('php://stdin');
//$n = intval($file[0]);
$n = 8;
//$s = explode(' ',trim($file[1]));
$s = explode(' ', '3 1 2 1 1 1 1 1 1');
$ss = array_count_values($s);
$count = 0;
$ost = 0;
if (isset($ss[4])) $count = $ss[4];
if (isset($ss[1]) OR isset($ss[3]))
    {
    if (isset($ss[1])) $one = ($ss[1])/4; else $one = 0;
    if (isset($ss[3])) $three = ($ss[3]*3)/4; else $three = 0;
    $sum = $three+$one;
    $count += floor($sum);
    $ost = $sum - floor($sum);
    if ($ost <=0.75 AND $ost>0.25 AND $three%2 ==1  ) {  $count++; $ost = 0; }
    }
if (isset($ss[2]))
{
$two = ($ss[2]*2)/4;
$count += floor($ss[2]/2);
$ost += $two - floor($two);
}
if ($ost!=0) $count+=ceil($ost);
echo $count;
?>

<?php
$num_group = trim(fgets(STDIN));
$group = trim(fgets(STDIN));

$arr_group = explode(" ", $group);
$arr_sisa = array();
$arr_taxi = array();
rsort($arr_group);

foreach($arr_group as $value)
{
	$bagi = intval($value)/4;
	$sisa_seat = 4-intval($value);
	if($sisa_seat == 0)
	{
		array_push($arr_taxi,1);
	}
	else{
		if ($sisa_seat > 0 && ($key = array_search($value, $arr_sisa)) !== false) {
		    unset($arr_sisa[$key]);
		}
		else{
			array_push($arr_taxi,1);
			array_push($arr_sisa, $sisa_seat);
		}
	}
}
echo count($arr_taxi);
?>

<?php
$str1 = trim(fgets(STDIN));
$str2 = explode(" ", trim(fgets(STDIN)));

//echo ceil(array_sum($str2)/4);

$n = 0;
while ($n <= 20) {
    $n++;
    if (in_array(3, $str2) && in_array(1, $str2)) {
        $str2[] = 4;
        $key1 = array_search(3, $str2);
        unset($str2[$key1]);
        $key2 = array_search(1, $str2);
        unset($str2[$key2]);
    }
    elseif (in_array(2, $str2) && in_array(2, $str2)) {
        $str2[] = 4;
        $key3 = array_search(2, $str2);
        unset($str2[$key3]);

        $key4 = array_search(2, $str2);
        unset($str2[$key4]);
    }
    elseif (in_array(2, $str2) && in_array(1, $str2)) {
        $str2[] = 3;
        $key5 = array_search(2, $str2);
        unset($str2[$key5]);

        $key6 = array_search(1, $str2);
        unset($str2[$key6]);
    }
    elseif (in_array(1, $str2) && in_array(1, $str2) && in_array(1, $str2) && in_array(1, $str2)) {
        $str2[] = 4;
        $key7 = array_search(1, $str2);
        unset($str2[$key7]);
        $key8 = array_search(1, $str2);
        unset($str2[$key8]);
        $key9 = array_search(1, $str2);
        unset($str2[$key9]);
        $key10 = array_search(1, $str2);
        unset($str2[$key10]);
    }
    elseif (in_array(1, $str2) && in_array(1, $str2)) {
        $str2[] = 2;
        $key11 = array_search(1, $str2);
        unset($str2[$key11]);

        $key12 = array_search(1, $str2);
        unset($str2[$key12]);
    }
}
echo count($str2);

<?php
$n = trim(fgets(STDIN));
$s = rsort(explode(' ', trim(fgets(STDIN))));
$taxi = 0;
$last = 0;
for ($i=0;$i<$n;$i++){
    if ($last + $s[$i] < 4)
        $last += $s[$i];
    else{
        $taxi++;
        $last = $s[$i];
    }
}

print $taxi;
?>

<?php
$str1 = trim(fgets(STDIN));
$str2 = explode(" ", trim(fgets(STDIN)));

$i = 1;
while ($i < $str1) {
    $i++;
    if (in_array(3, $str2) && in_array(1, $str2)) {
        $str2[] = 4;
        $key1 = array_search(3, $str2);
        unset($str2[$key1]);
        $key2 = array_search(1, $str2);
        unset($str2[$key2]);
    }
    elseif (in_array(2, $str2) && in_array(2, $str2)) {
        $str2[] = 4;
        $key3 = array_search(2, $str2);
        unset($str2[$key3]);

        $key4 = array_search(2, $str2);
        unset($str2[$key4]);
    }
}
echo count($str2);

<?php
//error_reporting(0);
$dir = fopen("php://stdin", 'r');
$num_groups = fgets($dir);
$num_people = fgets($dir);
$num_people_in_group = explode(" ", $num_people);
$taxi = 0;
$max = intval(max($num_people_in_group));
$min =  intval(min($num_people_in_group));
if ($max== $min) {
	if ($max==4 or $max==3) {
		$taxi=$num_groups;
	}else{
	if (($num_groups % 4)==0 or $min==2) {
		$taxi = ($num_groups * $min)/4;
	}else{
		$taxi = intval(($num_groups * $min)/4)+1;
	}
}

}else{
sort($num_people_in_group);
for ($a=0; $a < $num_groups ; $a++) {
	$value = $num_people_in_group[$a];
		for ($i=$num_groups-1; $i >=0 ; $i--) {
			if ($a!=$i) {
				$maxval=$num_people_in_group[$i];
				if ($maxval==4) {
					$num_people_in_group[$i]=0;
					$taxi+=1;
					continue;
				}elseif ($maxval==0) {
					continue;
				}elseif (($value+$maxval)==4 ) {
					$num_people_in_group[$i]=0;
					$num_people_in_group[$a]=0;
					$taxi+=1;
					break;
				}elseif (($value+$maxval)<4 and $i!=$a) {
					$num_people_in_group[$i]+=$value;
					$num_people_in_group[$a]=0;
					break;
				}/*elseif (($value+$maxval)>4 and $i!=$a) {
					//$taxi+=2;
					break;
				}*/
			}else{
				break;
			}
		}
	if ($a == $i) {
	break;
	}
}

foreach ($num_people_in_group as  $value) {
	if ($value>0) {
		$taxi+=1;
	}
}
}
echo $taxi;

?>

<?php
	// Спрашиваем данные
	$line = fopen('php://stdin', 'r');
	$_1 = explode (" ", $line);
	$_1 = explode ("\r\n", $line);
	array_shift($_1);

	// Создаем массив с данными
	$s = explode (" ", $_1);

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам не нужны.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if(($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			$answer = $four + $two + $one_and_three;

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>

<?php

$input = fgets(STDIN);
$input = fgets(STDIN);
$numbers = explode(' ', rtrim($input));

$groups = array_count_values($numbers);

if (!isset($groups[4])) $groups[4] = 0;
if (!isset($groups[3])) $groups[3] = 0;
if (!isset($groups[2])) $groups[2] = 0;
if (!isset($groups[1])) $groups[1] = 0;

$answer = $groups[4];

$answer += $groups[3];
$groups[1] -= $groups[3];

$answer += (int)($groups[2] / 2);
if ($groups[2] % 2 == 1) {
    $answer += 1;
    $groups[1] -= 1;
}

if ($groups[1] > 0) {
    $answer += ceil($groups[1] / 4);
}

echo $answer . PHP_EOL;

<?php
$file = file('php://stdin');
$n = intval($file[0]);
//$n = 100000;
$s = explode(' ',trim($file[1]));
//$s = explode(' ', '3 3 3 3 3 3 3 3');
$ss = array_count_values($s);
$count = 0;
$ost = 0;
if (isset($ss[4])) $count = $ss[4];
if (isset($ss[1]) AND isset($ss[3]))
    {
    if (isset($ss[1])) $one = ($ss[1])/4; else $one = 0;
    if (isset($ss[3])) $three = ($ss[3]*3)/4; else $three = 0;
    $sum = $three+$one;
    $count += floor($sum);
    $ost = $sum - floor($sum);
    if ($ost <=0.75 AND $ost>0.25 AND $three%2 ==1  ) {  $count++; $ost = 0; }
    }
if (isset($ss[2]))
{
$two = ($ss[2]*2)/4;
$count += floor($ss[2]/2);
$ost += $two - floor($two);
}
if ($ost!=0) $count+=ceil($ost);
echo $count;
?>

<?php
$num_group = trim(fgets(STDIN));
$str = trim(fgets(STDIN));
$taxi = 0;
$arr_penumpang = explode(" ",$str);
$count = array_count_values($arr_penumpang);

while($count[4]>0)
{
	$taxi = $taxi + 1;
	$count[4] = $count[4] - 1;
}
while($count[3]>0)
{
	$taxi = $taxi + 1;
	$count[3] = $count[3] - 1;
	if($count[1]>0)
	{
		$count[1] = $count[1] - 1;
	}
}
while($count[2]>1)
{
	$taxi = $taxi + 1;
	$count[2] = $count[2] - 2;
}
while($count[1]>0)
{
	if($count[2]>0){
		$count[1] = $count[1] - 2;
	}
	else
	{
		$count[1] = $count[1] - 4;
	}
	$taxi = $taxi + 1;
}
echo $taxi;
?>

<?php
/*header("Content-Type: text/html; charset=utf-8");*/
$count_pupils = fgets(STDIN);
$groups = fgets(STDIN);
$count_pupils = (int) $count_pupils;
$groups = explode(' ', $groups);
$count = 0;
foreach($groups as $key => $group){
	$count += $group;
}
echo ceil($count / 4);
?>

<?php
	// Спрашиваем у юзера данные
	$_1 = fgets(STDIN);
	$_2 = fgets(STDIN);

	// Создаем массив с данными
	$s = explode (" ", $_2);

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам не нужны.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if(($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			$answer = $four + $two + $one_and_three;

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode(',', $one_minus_three);
					$b = (int) '0.'.$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>

<?php
	// Спрашиваем данные
	$_1 = fgets(STDIN);
	$_1 = fgets(STDIN);

	// Создаем массив с данными
	$s = explode(' ', rtrim($_1));

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам не нужны.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if(($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}
		if ($one_first == 0 && $three_first == 0) $one_and_three = 0;

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			if ($one_first <= 2 && $three_first < 1) {
				$answer = $four + $two;
			} else {
				$answer = $four + $two + $one_and_three;
			}

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>

<?php
$file = file('php://stdin');
$n = intval($file[0]);
//$n = 8;
$s = explode(' ',trim($file[1]));
$s = explode(' ', '1 2 4 3 3');
$ss = array_count_values($s);
$count = 0;
$ost = 0;
if (isset($ss[4])) $count = $ss[4];
if (isset($ss[1]) OR isset($ss[3]))
    {
    if (isset($ss[1])) $one = ($ss[1])/4; else $one = 0;
    if (isset($ss[3])) $three = ($ss[3]*3)/4; else $three = 0;
    $sum = $three+$one;
    $count += floor($sum);
    $ost = $sum - floor($sum);
    if ($ost <=0.75 AND $ost>0.25 AND $three%2 ==1  ) {  $count++; $ost = 0; }
    }
if (isset($ss[2]))
{
$two = ($ss[2]*2)/4;
$count += floor($ss[2]/2);
$ost += $two - floor($two);
}
if ($ost!=0) $count+=ceil($ost);
echo $count;
?>

<?php

fscanf(STDIN, "%d\n", $number);
$line = trim(fgets(STDIN));
$studentArray = explode(' ', $line, $number);
$total = 0;

foreach($studentArray as $n) $total += $n ;
$need = ceil($total/4);

fwrite(STDOUT, $need."\n");

while(($line = fgets(STDIN)) != false)
{
    $arr[] = $line;
}

$group_number = $arr[0];
$group_array = explode(" ", $arr[1]);

$cars = 0;
$current_car = 0;

$three = 0;
$two = 0;
$one = 0;
$time_start = microtime_float();
    //Первый этам, ищем четверки
    for ($i=0; $i<count($group_array); $i++) {
    //foreach ($group_array as $key=>$people) {
        $people = $group_array[$i];
        $key = $i;
        if ($people == 4) {
            $cars++;
            //unset($group_array[$key]);
        }

        if ($people == 3) {

            if ($one>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                $one--;
            } else {
                $three++;
            }
        }
        if ($people == 2) {
            if ($two>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                $two--;
                //unset()
            } else {
                $two++;
            }
        }
        if ($people== 1) {
            if ($three>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                $three--;
            } else {
                $one++;
            }
        }
    }

    if ($three>0) {
        $cars += $three;
    }

    if ($two>0) {
        if ($one>0) {
            $cars++;
            if ($one>2) {
                $count_one = $one-2;
                $cars += ceil($count_one/4);
                $one = array();
            } else {
                $one = array();
            }
        } else {
            $cars += $two;
        }
    }

    if ($one > 0) {
        $cars += ceil($one/4);
    }

    //echo $cars;
    fputs(STDOUT, $cars);

<?php
$file = file('php://stdin');
$n = intval($file[0]);
//$n = 100000;
$s = explode(' ',trim($file[1]));
//$s = explode(' ', '3 3 3 3 3 3 3 3');
$ss = array_count_values($s);
$count = 0;
$ost = 0;
if (isset($ss[4])) $count = $ss[4];
if (isset($ss[1]) OR isset($ss[3]))
    {
    if (isset($ss[1])) $one = ($ss[1])/4; else $one = 0;
    if (isset($ss[3])) $three = ($ss[3]*3)/4; else $three = 0;
    if (!isset($ss[1]) AND isset($ss[3]) AND $ss[3]>4) $count+=$ss[3];
    else
    {
        $sum = $three+$one;
        $count += floor($sum);
        $ost = $sum - floor($sum);
        if ($ost <=0.75 AND $ost>0.25 AND $three%2 ==1  ) {  $count++; $ost = 0; }
    }
    }
if (isset($ss[2]))
{
$two = ($ss[2]*2)/4;
$count += floor($ss[2]/2);
$ost += $two - floor($two);
}
if ($ost!=0) $count+=ceil($ost);
echo $count;
?>

<?php
$strParty = trim(fgets(STDIN));
$strCount = trim(fgets(STDIN));
$arrayCount = explode(" ",$strCount);
if(!$arrayCount) exit(1);
if(!$strParty) exit(1);

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 2) $arrayTwoDigits[] = $i;

for($i = 0; $i < count($arrayTwoDigits);$i++)
{
    if(isset($arrayCount[isset($arrayTwoDigits[$i+1])]))
     {
        if($arrayCount[$arrayTwoDigits[$i]] + $arrayCount[$arrayTwoDigits[$i+1]] == 4)
         {
            $arrayCount[$arrayTwoDigits[$i+1]] = 4;
            unset($arrayCount[$arrayTwoDigits[$i]]);
         }
     }

}

sort($arrayCount);

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 3) $arrayTwoDigits1[] = $i;

for($i = 0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i] == 1)
     {
        $j = 0;
        if($arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$j]] == 4)
         {
            $arrayCount[$arrayTwoDigits1[$j]] = $arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$j]];
            unset($arrayCount[$i]);
            unset($arrayTwoDigits1[$j]);
            sort($arrayTwoDigits1);
         }
      }

}
sort($arrayCount);

for($i =0; $i < count($arrayCount);$i++)
{
    if(isset($arrayCount[$i+1]))
    {
     if($arrayCount[$i] + $arrayCount[$i+1] <=4 )
      {
        $arrayCount[$i+1] = $arrayCount[$i] + $arrayCount[$i+1];
        unset($arrayCount[$i]);
      }
    }
    else;

}
sort($arrayCount);
$cCount = count($arrayCount);
echo $cCount;
?>

<?php
$input = fgets(STDIN);
$input = fgets(STDIN);
$groups_count = explode(' ', $input);
$groups = array_count_values($groups_count);
if(!isset($groups[4])) $groups[4] = 0;
if(!isset($groups[3])) $groups[3] = 0;
if(!isset($groups[2])) $groups[2] = 0;
if(!isset($groups[1])) $groups[1] = 0;
$taxi = $groups[4];
$taxi += $groups[3];
$groups[1] -= $groups[3];
$taxi += $groups[2] / 2;
if($groups[1] > 0){
	$taxi += ceil($groups[1] / 4);
}
echo ceil($taxi);
?>

<?php
while($s = fgets(STDIN))
{
    $input .= $s;
}

$input = explode("\r\n", $input);
$input = explode(" ", $input[1]);
$groups = array();
foreach($input as $i) $groups[] = (int)$i;
rsort($groups);
$c = 0;
for($i = 0; $i < count($groups); $i++)
{
    if(!isset($groups[$i])) continue;
    $group = $groups[$i];
    if($group === 4)
    {
        $c++;
        continue;
    }

    if($group === 3)
    {
        $c++;
        $index = array_search(1, $groups);
        if($index !== FALSE) { unset($groups[$index]); continue; }
    }

    if($group === 2)
    {
        $c++;
        $index = array_search(2, $groups);
        if($index !== FALSE) { unset($groups[$index]); continue; }
        $index = array_search(1, $groups);
        if($index !== FALSE) { unset($groups[$index]); } else { continue; }
        $index = array_search(1, $groups);
        if($index !== FALSE) { unset($groups[$index]); } else { continue; }
    }

    if($group === 1)
    {
        $c++;
        $index = array_search(1, $groups);
        if($index !== FALSE) { unset($groups[$index]); } else { continue; }
        $index = array_search(1, $groups);
        if($index !== FALSE) { unset($groups[$index]); } else { continue; }
        $index = array_search(1, $groups);
        if($index !== FALSE) { unset($groups[$index]); } else { continue; }
    }
}

echo $c;

<?php
$file = file('php://stdin');
$n = intval($file[0]);
$s = explode(' ',trim($file[1]));
sort($s);
for ($i = 0; $i < $n; $i++)
{
    if (max($s) == 4) {$key = array_search(4, $s); unset($s[$key]); $count++;}
    if (($s[0]+max($s))<=4) { $s[0]=$s[0]+array_pop($s);  sort($s);}
}
if(isset($s[0])) { $count = $count + ceil(array_sum ($s)/4);}
echo $count;

?>

$strParty = trim(fgets(STDIN));
$strCount = trim(fgets(STDIN));
$arrayCount = explode(" ",$strCount);
//$strParty = 100000;
//for($i = 0; $i < $strParty;$i++) $arrayCount[$i] = rand(1,4);

if(!$arrayCount) exit(1);
if(!$strParty) exit(1);
if($strParty != count($arrayCount)) exit(1);

function first($arrayCount)
{

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 2) $arrayTwoDigits[] = $i;

for($i = 0; $i < count($arrayTwoDigits);$i++)
{
    if($arrayCount[$arrayTwoDigits[$i+1]])
     {
        if($arrayCount[$arrayTwoDigits[$i]] + $arrayCount[$arrayTwoDigits[$i+1]] == 4)
         {
            $arrayCount[$arrayTwoDigits[$i+1]] = 4;
            unset($arrayCount[$arrayTwoDigits[$i]]);
         }
     }

}

sort($arrayCount);
return $arrayCount;
}

function four($arrayCount)
{

for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 1) $arrayTwoDigits2[] = $i;

for($i = 0; $i < count($arrayTwoDigits2);$i++)
{
    if($arrayCount[$arrayTwoDigits2[$i+1]])
     {
        if($arrayCount[$arrayTwoDigits2[$i]] + $arrayCount[$arrayTwoDigits2[$i+1]] == 2)
         {
            $arrayCount[$arrayTwoDigits2[$i+1]] = 2;
            unset($arrayCount[$arrayTwoDigits2[$i]]);
         }
     }

}

sort($arrayCount);
return $arrayCount;
}

function second($arrayCount)
{
for($i = 0; $i < count($arrayCount);$i++) if($arrayCount[$i] == 3) $arrayTwoDigits1[] = $i;

for($i = 0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i] == 1)
     {
        $j = 0;
        if($arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$j]] == 4)
         {
            $arrayCount[$arrayTwoDigits1[$j]] = $arrayCount[$i] + $arrayCount[$arrayTwoDigits1[$j]];
            unset($arrayCount[$i]);
            unset($arrayTwoDigits1[$j]);
            sort($arrayTwoDigits1);
         }
      }

}
sort($arrayCount);
return $arrayCount;
}

$arrayCount = first($arrayCount);
//print_r($arrayCount);
$arrayCount = second($arrayCount);
//print_r($arrayCount);
$arrayCount = four($arrayCount);
$arrayCount = first($arrayCount);

for($i =0; $i < count($arrayCount);$i++)
{
    if($arrayCount[$i+1])
    {
     if($arrayCount[$i] + $arrayCount[$i+1] <=4 )
      {
        $arrayCount[$i+1] = $arrayCount[$i] + $arrayCount[$i+1];
        unset($arrayCount[$i]);
      }
    }

}
sort($arrayCount);

// print_r($arrayCount);
$cCount = count($arrayCount);
print $cCount;

<?php
fscanf(STDIN, "%d", $n);
$groups = explode(" ", trim(fgets(STDIN)));

$mem = array_sum($groups);
$count_car = ($mem<4) ? $mem : (int) ($mem/4) + $mem%4;

echo $count_car;
?>

<?php
function read() {
	fscanf(STDIN, "%d", $n);
	$groups = explode(" ", trim(fgets(STDIN)));
	return $groups;
}

function get_sum($counts) {

	$sum = $counts[4] + $counts[3];
	$diff = $counts[1] - $counts[3];	// left 1s from combining them with 3s
	// combine the left 1s with 2s and get the sum
	if ($dif > 0) {
		$sum += ceil($diff / 4 + $counts[2] / 2);
	} else {
		$sum += ceil($counts[2] / 2);
	}
	return $sum;
}

function get_counts($groups){

	$counts = array(0,0,0,0,0);
	foreach ($groups as $g) $counts[$g]++;

	return $counts;
}

$groups = read();
$counts = get_counts($groups);
$sum = get_sum($counts);

echo $sum;

<?php
$n = trim(fgets(STDIN));
$s = explode(" ", trim(fgets(STDIN))) ;
$i = 0;
$j=0;
$total=0;

while ($i <= count($s)) {
	if($j+$s[$i] > 4){
		$total++;
		$j=0;
	}
	$j=$j+$s[$i];
	$i++;
}

if($j == 0){
	echo $total;
}
else{
	echo $total=$total+1;
}

?>

<?php
	// Спрашиваем данные
	$_1 = fgets(STDIN);
	$_1 = fgets(STDIN);

	// Создаем массив с данными
	$s = explode(' ', rtrim($_1));

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам не нужны.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if(($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first <= 2 && $three_first == 0) $two = 0;
			if ($four == 0 && $one_first == 0 && $three_first == 0) $two = 1;
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			$answer = $four + $two + $one_and_three;

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>

<?php
	$total = 0;
	$list_1 = 0;
	$list_2 = 0;
	$list_3 = 0;
	$list_4 = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	foreach ($list as $val) {
		if ($val == 1) $list_1++;
		elseif ($val == 2) $list_2++;
		elseif ($val == 3) $list_3++;
		elseif ($val == 4) $list_4++;
	}
	$total = $list_4;
	$total += ceil($list_2 / 2);
	$min = min($list_1,$list_3);
	$total += $min;
	$list_1 -= $min;
	$list_3 -= $min;
	$total += ceil($list_1 / 4);
	$total += $list_3;
    echo $total;
	/*
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	rsort($list);
	while (count($list) > 0) {
		while (count($list) > 1) {
            if ($list[0] + $list[count($list)-1] <= 4) {
                $list[0] += $list[count($list)-1];
                unset($list[count($list)-1]);
                $list = array_values($list);
            } else {
                break;
            }
        }
		unset($list[0]);
        $list = array_values($list);
		$total++;
	}
	echo $total;
	*/

<?php
// $fp=fopen("a.txt", "r");
fscanf(STDIN, "%d", $n);
$groups=explode(" ", fgets(STDIN));

for ($i=0; $i < $n; $i++) $groups[$i]=(int)$groups[$i];

$count=0;
$arr=array_count_values($groups);

$count+=$arr[4];
if(!$arr[3]) $arr[3]=0;
if(!$arr[2]) $arr[2]=0;
if(!$arr[1]) $arr[1]=0;
print_r($arr);

if($arr[3]>$arr[1]){
	$count+=$arr[3]+ceil($arr[2]/2);
	echo $count;
	exit;
}

else if($arr[3]<$arr[1]){
	$count+=$arr[3];
	$arr[1]-=$arr[3];
}

else{
	$count+=$arr[3]+ceil($arr[2]/2);
	echo $count;
	exit;
}

$count+=ceil(($arr[2]*2+$arr[1])/4);
echo $count;
?>

<?php
$groups_count = fgets(STDIN);
$groups_count = explode(' ', $groups_count);
$groups = array_count_values($groups_count);
if(!isset($groups[4])) $groups[4] = 0;
if(!isset($groups[3])) $groups[3] = 0;
if(!isset($groups[2])) $groups[2] = 0;
if(!isset($groups[1])) $groups[1] = 0;
$taxi = $groups[4];
$taxi += $groups[3];
$groups[1] -= $groups[3];
$taxi += $groups[2] / 2;
if($groups[1] > 0){
	$taxi += ceil($groups[1] / 4);
}
echo ceil($taxi);
?>

<?php

$commands = array();
while(($line = fgets(STDIN)) != false)
{
    $arr[] = $line;
}

$group_number = $arr[0];
$group_array = explode(" ", $arr[1]);
$cars = 0;
$current_car = 0;

$three = array();
$two = array();
$one = array();
//while (!empty($group_array)) {
    //Первый этам, ищем четверки
    foreach ($group_array as $key=>$people) {
        if ($people == 4) {
            $cars++;
            unset($group_array[$key]);
        }

        if ($people == 3) {

            if (count($one)>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                array_shift($one);
            } else {
                $three[$key] = 1;
            }
        }
        if ($people == 2) {
            if (count($two)>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                array_shift($two);
            } else {
                $two[$key] = 1;
            }
        }
        if ($people== 1) {
            if (count($three)>0) { //Если нашли тройку и до этого нашли единицу - сажаем в тачку чуваков
                $cars++;
                array_shift($three);
            } else {
                $one[$key] = 1;
            }
        }
    }

    if (count($three)>0) {
        $cars += count($three);
    }

    if (count($two)>0) {
        if (count($one)>0) {
            $cars++;
            if (count($one)>2) {
                $count_one = count($one)-2;
                $cars += ceil($count_one/4);
                $one = array();
            }
        } else {
            $cars += count($two);
        }
    }

    if (count($one) > 0) {
        $cars += ceil(count($one)/4);
    }

    fputs(STDOUT, $cars);

?>

<?php
fscanf(STDIN, '%d\n', $n);	// считываем кол-во групп школьников

$line = fgets(STDIN);				// считываем группы школьников как строку
$groups = explode(' ', $line);	// теперь groups - это массив чисел
$cars = [];

// if((array_sum($groups) % 4) == 0){		// проверяем, можно ли поделить всех школьников на группы, по 4 человека в каждой
// 	$cars = array_sum($groups) / 4;		// в каждую машину сажаем 1 группу школьников
// 	printf($cars);
// 	} else {

	$cars = array();

	$total = ceil(count($groups) / 4);

	printf($total);

<?php
$file = file('php://stdin');
$n = intval($file[0]);
//$n = 100000;
$s = explode(' ',trim($file[1]));
//$s = explode(' ', '3 3 3 3 3 3 3 3');
$ss = array_count_values($s);
$count = 0;
$ost = 0;
if (isset($ss[4])) $count = $ss[4];
if (isset($ss[1]) OR isset($ss[3]))
    {
    if (isset($ss[1])) $one = ($ss[1])/4; else $one = 0;
    if (isset($ss[3])) $three = ($ss[3]*3)/4; elseif ($ss[3]>4) $three = $ss[3]; else $three = 0;

        $sum = $three+$one;
        $count += floor($sum);
        $ost = $sum - floor($sum);
        if ($ost <=0.75 AND $ost>0.25 AND $three%2 ==1  ) {  $count++; $ost = 0; }

    }
if (isset($ss[2]))
{
$two = ($ss[2]*2)/4;
$count += floor($ss[2]/2);
$ost += $two - floor($two);
}
if ($ost!=0) $count+=ceil($ost);
echo $count;
?>

<?php
error_reporting(0);
$h = fopen('php://stdin', 'r');

$groupsCounter = intval(trim(fgets($h)));

$holder = 0;
$races  = 0;

for ($i = 0; $i < $groupsCounter; $i++) {
    $char = intval(fgetc($h));
    $holder[$char]++;

    //space
    fgetc($h);
}
$races  = $holder[4] + ceil( abs($holder[1] - $holder[3]) / 4 + $holder[2] / 2 );

<?php

fscanf(STDIN, "%d\n", $number);
$line = trim(fgets(STDIN));
$studentArray = explode(' ', $line, $number);
$total = 0;

foreach($studentArray as $n) $total += $n ;
$need = ceil($total/4);

fwrite(STDOUT, $need."\n");

<?php
function read() {
	fscanf(STDIN, "%d", $n);
	$groups = explode(" ", trim(fgets(STDIN)));
	return $groups;
}

function get_sum($counts) {
	$sum = $counts[4];
	if ($counts[3] - $counts[1] >= 0) {
		$sum += $counts[3] + ceil($counts[2] / 2);
	} else {
		$rest_ones = $count[1] - $count[3];
		$sum += $counts[3] + floor($count[2] / 2);

		if ($count[2] % 2  - $rest_ones >= 0) {
			$sum += $counts[2] % 2;
		} else {
			$rest_ones = $rest_ones - $counts[2] % 2;
			$sum += $rest_ones / 4 + $rest_ones % 4;
		}
	}

	return $sum;
}

function get_counts($groups){

	$counts = array(0,0,0,0,0);
	foreach ($groups as $g) $counts[$groups]++;

	return $counts;
}

$groups = read();
$counts = get_counts($groups);
$sum = get_sum($counts);

echo $sum;

<?php
$group = fopen('php://stdin', 'r');
$group = explode(' ', $group);
$group = array_count_values($group);
if(!isset($group[1])) $group[1] = 0;
if(!isset($group[2])) $group[2] = 0;
if(!isset($group[3])) $group[3] = 0;
if(!isset($group[4])) $group[4] = 0;

$taxi += $group[4];
$taxi += $group[3];
$group[1] -= $group[3];
$taxi += $group[2] / 2;
if($group[1] > 0){
	$taxi += $group[1] / 4;
}

echo ceil($taxi);

<?php
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	for ($x = 0; $x < count($list); $x++) {
		$list[$x] = (int)$list[$x];
	}
	rsort($list);
	while (count($list) > 0) {
		if (count($list) > 1) {
			while (count($list) > 1) {
                if ($list[0] == 4) {
	                unset($list[0]);
                    rsort($list);
                } elseif ($list[0] + $list[count($list)-1] <= 4) {
                    unset($list[0]);
                    unset($list[count($list)-1]);
                    rsort($list);
                } else {
                    break;
                }
            }
		} else {
			unset($list[0]);
			rsort($list);
		}
		$total++;
	}
	echo $total;

<?php
$a = fgets(STDIN);
$b = fgets(STDIN);
$sum = 0;
$b = explode(" ", $b);
for($i = 0; $i < $a; $i++){
$sum+=$b[$i];
}
echo ceil($sum/4);

?>

<?php
	$total = 0;
	$n = (int)fgets(STDIN);
	$list = explode(' ',fgets(STDIN));
	for ($x = 0; $x < count($list); $x++) {
		$list[$x] = (int)$list[$x];
	}
	rsort($list);
	while (count($list) > 0) {
		if (count($list) > 1) {
			if ($list[0] + $list[count($list)-1] <= 4) {
				unset($list[count($list)-1]);
			}
		}
		$total++;
		unset($list[0]);
		rsort($list);
	}
	echo $total;

<?php
/*header("Content-Type: text/html; charset=utf-8");*/
$count_pupils = fgets(STDIN);
$groups = fgets(STDIN);
$count_pupils = (int) $count_pupils;
$groups = explode(' ', $groups);
$count = 0;
foreach($groups as $key => $group){
	$count += $group;
}
echo ceil($count / 4);
?>

<?php
	// Спрашиваем данные
	$_1 = fgets(STDIN);
	$_1 = fgets(STDIN);

	// Создаем массив с данными
	$s = explode(' ', rtrim($_1));

	// Получаем кол-во такси для групп по 4 человека. Ведь по факту больше 4 человек в машину не вместится, поэтому для дальнейших вычислений четверки нам не нужны.
	$four = count(array_diff($s, array(1, 2, 3)));

	// У нас остались только 1-цы, 2-ки и 3-ки. Посчитаем для начала кол-во 2-к.
	$two_first = count(array_diff($s, array(1, 3, 4)));
	// Проще всего будет начать именно с них. Ведь если 2-к четное кол-во, тогда в каждую машину удастся усадить по 2 группы по 2 человека, следовательно у нас останутся только 1-цы и 3-ки.
	if(($two_first % 2) == 0) {
		$two = ($two_first / 2);
		// Ну вот у нас и остались только 1-цы да 3-ки. Посчитаем их.
		$one_first = count(array_diff($s, array(2, 3, 4)));
		$three_first = count(array_diff($s, array(1, 2, 4)));
		// Если кол-во 1-ц и 3-к совпадает, то мы можем в каждую машину посадить по одной 1-це и по одной 3-ке. Следовательно кол-во такси будет в 2 раза меньше, чем сумма кол-ва этих цифр.
		if ($one_first == $three_first) {
			$one_and_three = (($one_first + $three_first) / 2);
		} else {
			// В противном случае, т.е. если их кол-во не равно, нам придется действовать немного иначе. Начнем со случая, когда 3-к больше, чем 1-ц.
			if ($three_first > $one_first) {
				// В этом случае кол-во такси будет равно кол-ву 1-ц (т.к. их меньше) плюс кол-во оставшихся 3-к.
				$one_and_three = ($one_first + ($three_first - $one_first));
			} else {
				// В этом случае кол-во такси будет равно кол-ву 3-к (т.к. их меньше) плюс кол-во оставшихся 1-ц, деленных на 4 и округленных до целого числа.
				$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
			}
		}

		// Получаем нужное нам кол-во такси
		$answer = $four + $two + $one_and_three;

		echo $answer;
	} else {
		// В случае, если 2-к нечетное кол-во, нам надо будет помнить, что у нас в запасе остается еще одна 2-ка.
		// Для начала найдем кол-во такси для четного кол-ва 2-к.
		$two = floor($two_first / 2);
		// Добавляем страховку на случай, если у нас всего одна 2-ка. В таком случае нам останется только посчитать заново оставшиеся 1-цы и 3-ки.
		if ($two_first == 1) {
			$two = 1;
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				$one_and_three = (($one_first + $three_first) / 2);
			} else {
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first));
				} else {
					$one_and_three = ($three_first + ceil(($one_first - $three_first) / 4));
				}
			}
			$answer = $four + $two + $one_and_three;

			echo $answer;
		} else {
			// Если 2-к у нас все-таки больше двух, в таком случае нам придется посчитать 1-цы и 3-ки с учетом того, что у нас в запасе остается еще одна 2-ка.
			// Для начала по-старинке считаем кол-во 1-ц и 3-к.
			$one_first = count(array_diff($s, array(2, 3, 4)));
			$three_first = count(array_diff($s, array(1, 2, 4)));
			if ($one_first == $three_first) {
				// В случае, если кол-во 1-ц и 3-к совпадает, они вместе образуют целое кол-во такси, так что нам придется брать одно дополнительное для оставшейся 2-ки.
				$one_and_three = (($one_first + $three_first) / 2) + 1;

				$answer = $four + $two + $one_and_three;

				echo $answer;
			} else {
				// В противном случае, т.е. если их кол-во не равно, нам придется действовать, опять же, немного иначе.
				// Начнем с легкого. Если 3-к больше, чем 1-ц.
				// В таком случае мы просто берем еще одно такси, так как нам не усадить в одно такси группу из 3-х человек и из 2-х одновременно.
				if ($three_first > $one_first) {
					$one_and_three = ($one_first + ($three_first - $one_first)) + 1;
				} else {
					// В случае же, если 1-ц больше, чем 3-к, нам придется сначала найти целое кол-во такси с 1-ми, если такое существует, а потом
					$one_minus_three = (($one_first - $three_first) / 4);
					list($a, $b) = explode('.', $one_minus_three);
					$b = '0.'.$b;
					$b = (double)$b;
					// Если получившееся число меньше либо равно 0,5 (т.е. 2 / 4), значит дополнительное такси брать не придется.
					if ($b <= 0.5) {
						$b = 1;
					} else {
						// Иначе нам придется брать дополнительное такси.
						$b = 2;
					}

					$one_and_three = ($three_first + $a + $b);
				}

				$answer = $four + $two + $one_and_three;

				echo $answer;
			}
		}
	}
?>