<?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
$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]);

<?
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
$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

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
// 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
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
$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

$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
$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

$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
$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
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

$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

	$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
        //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
/**
 * 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

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
	$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
$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
//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;
			}
		}
	}
?>