After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to celebrate his birthday. We know that the i-th group consists of si friends (1 ≤ si ≤ 4), and they want to go to Polycarpus together. They decided to get there by taxi. Each car can carry at most four passengers. What minimum number of cars will the children need if all members of each group should ride in the same taxi (but one taxi can take more than one group)?
The first line contains integer n (1 ≤ n ≤ 105) — the number of groups of schoolchildren. The second line contains a sequence of integers s1, s2, ..., sn (1 ≤ si ≤ 4). The integers are separated by a space, si is the number of children in the i-th group.
Print the single number — the minimum number of taxis necessary to drive all children to Polycarpus.
5 1 2 4 3 3
4
8 2 3 4 4 2 1 3 1
5
In the first test we can sort the children into four cars like this:
- the third group (consisting of four children),
- the fourth group (consisting of three children),
- the fifth group (consisting of three children),
- the first and the second group (consisting of one and two children, correspondingly).
There are other ways to sort the groups into four cars.
water.
未优化:
/*62ms,400KB*/
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int group[100001];///亦可以用multiset实现
int main()
{
int n, count = 0, j = 0;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d", &group[i]);
sort(group, group + n);
for (int i = n - 1; i >= j; --i)
{
if (group[i] == 4)
++count;
else if (group[i] == 3)
{
if (group[j] == 1)
++j;
++count;
}
else if (group[i] == 2)
{
if (group[j] == 1 && group[j + 1] == 1)
j += 2;
else if (i && group[i - 1] == 2)
--i;
else if (i - j == 1)
{
++count;
break;
}
++count;
}
else///group[i]==1
{
count += ceil((double)(i - j + 1) / 4);
break;
}
}
printf("%d", count);
return 0;
}
优化:
/*62ms,0KB*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <map>
#include <set>
typedef unsigned long long ULL;
typedef long long LL;
using namespace std;
int arr[5];
int main()
{
int N, id;
scanf("%d", &N);
for (int i = 0; i < N; ++i)
{
scanf("%d", &id);
arr[id]++;
}
int ANS = arr[4] + arr[3];///先把最初能加的都加上
///“调整”思想
if (arr[1] > arr[3])
arr[1] -= arr[3];
else
arr[1] = 0;
if (arr[2] % 2 == 0)
ANS += (arr[2] / 2);
else
{
ANS += (arr[2] / 2) + 1;
arr[1] -= 2;
}
if (arr[1] > 0)
ANS += arr[1] / 4 + (arr[1] % 4 ? 1 : 0);
printf("%d", ANS);
return 0;
}

本文介绍了一个来自 Codeforces 的编程挑战题目 B.Taxi 的解决方案。任务是计算最少需要多少辆出租车来运送分成不同小组的学校儿童到 Polycarpus 的生日聚会,每辆车最多可以容纳四名乘客,并且同一组的孩子必须乘坐同一辆车。
2087

被折叠的 条评论
为什么被折叠?



