题面:
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 sifriends (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)?
Input
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.
Output
Print the single number — the minimum number of taxis necessary to drive all children to Polycarpus.
Examples
Input
5 1 2 4 3 3
Output
4
Input
8 2 3 4 4 2 1 3 1
Output
5
这道题比较经典,可以枚举,也可以贪心,有两种方法;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n;
int a[5];
int main()
{
ios::sync_with_stdio(false);
while(cin>>n){
int x;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
cin>>x;
a[x]++;
}
int p=0;
if(a[4]>0){
p+=a[4];
}
if(a[3]>0){
p+=a[3];
a[1]-=a[3];
}
if(a[2]>0){
if(a[2]%2==0){
p+=a[2]/2;
}else{
p+=a[2]/2+1;
a[1]-=2;
}
}
if(a[1]>0){
if(a[1]%4==0){
p+=a[1]/4;
}else{
p+=a[1]/4;
p++;
}
}
cout<<p<<endl;
}
return 0;
}
贪心代码如下:
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[x]++;
}
int m=a[4];
n-=m;
while(n){
int vis=4;
m++;
for(int i=3;i>0;i--){
while(a[i]&&vis>=i){
vis-=i;
a[i]--;
n--;
}
}
}
cout<<m<<endl;
return 0;
}