原题链接:http://codeforces.com/problemset/problem/158/B
分析:
题意分析:有n组人,每组人个人只为4,3,2,1;没辆车最多载4个人,问最少用几辆车把人都装走。
算法分析:我用一个数组p,p[i]=j表是i个人有多少组。 接着就是一组一组判断了。p[4],有多少组就要多少车(车最多载4个人),p[3]和p[1]组合,让车尽量载4个人,看要多少车。以此类推····(自己觉得这个思路好搓...%>_<%)
我的代码:
#include<stdio.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
int p[5]={0};
int ans=0;
while(n--)
{
int a;
scanf("%d",&a);
p[a]++;
}
ans=p[4];
p[4]=0;
if(p[3]<=p[1]) //3和1组合,可以被匹配完。
{
ans+=p[3];
p[1]-=p[3]; //1个人的组数减去与三匹配了的1.
p[3]=0;
}
else
{
ans+=p[1]; //1与3匹配,在一辆车里。。
ans+=(p[3]-p[1]); //剩下的3,每组一辆车。
p[1]=0;
p[3]=0;
}
//printf("3=%d\n",ans);
//printf("%d %d %d %d\n",p[1],p[2],p[3],p[4]);
ans+=p[2]/2;
// p[2]=p[2]-p[2]/2;
if(p[2]%2==1)
{
ans++;
p[1]-=2;
}
//printf("2=%d\n",ans);
if(p[1]>0)
{
ans+=p[1]/4;
if(p[1]%4!=0) ans++;
}
printf("%d\n",ans);
}
return 0;
}