158B_Taxi

原题链接: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

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;
}



你可能感兴趣的:(codeforces)