您的位置:首页 > 其它

codeforces-158B-Taxi题解

2016-05-11 21:56 127 查看
这题写的我简直醉醉的,一道不难的贪心,大致意思就是说让你输入n,然后输入n个数,每个数表示的是该组学生的数量(1<=s<=4),然后每辆车可以最多拉四个人,并且每组的学生必须坐在同一辆车上,求最少需要几辆车。思路就是贪心,数量为4的学生必然需要一辆车,数量为3则可以搭配一个数量为1的组,剩下的就是人数为2的组和剩余的数量为1的组了,让它们组合填满出租车,求得的就是最少需要的车的数量了。。我的代码问题在于当出现特殊组数时不能满足,需要单独考虑,而标程利用整除的性质很好的解决了这一问题,并且提供了及其简洁的代码。

我的代码:

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

int a[100010];

int main()

{

   int n,i;

   int count;

   int p1,p2,p3,p4;

   while(cin>>n)

   {

       count=0;

       p1=p2=p3=0;

       p4=0;

       memset(a,0,sizeof(a));

       for(i=0;i<n;i++)

        cin>>a[i];

       sort(a,a+n);

       i=0;

       while(a[i]==1)

       {

           p1++;

           i=i+1;

       }

       while(a[i]==2)

       {

           p2++;

           i=i+1;

       }

       while(a[i]==3)

       {

           p3++;

           i=i+1;

       }

       while(a[i]==4)

       {

           count++;

           i=i+1;

       }

       if(p3-p1>=0)

       {

           count=count+p3;

           p1=0;

       }

       else

       {

           count=count+p3;

           p1=p1-p3;

       }

       if(p1==0)

       {  if(p2%2==0)

           count=count+p2/2;

          else

          {

              if(p2==1)

                count=count+1;

              else

              {

                  count=count+1+(p2-p2%2)/2;

              }

          }

       }

       else

       {

           int tmp,left;

           tmp=p1/4;

           if(tmp==0)

           {

               tmp=p1/2;

               left=p1%2;

               p2=p2+tmp;

                if(p2%2==0)

                count=count+p2/2;

              else

              {

                 if(p2==1)

                  count=count+1;

                  else

                  {

                  count=count+1+(p2-p2%2)/2;

                  }

              }

           }

           else

           {

               count=count+p1/4;

               p1=p1-(p1/4)*4;

                tmp=p1/2;

               left=p1%2;

               p2=p2+tmp;

                if(p2%2==0)

                count=count+p2/2;

              else

              {

                 if(p2==1)

                  count=count+1;

                  else

                  {

                  count=count+1+(p2-p2%2)/2;

                  }

              }

           }

       }

       cout<<count<<endl;

   }

}

标准程序:

#include<iostream>

using namespace std;

int A[5],N,i,t;

main(){

cin>>N;

while(cin>>t)

  A[t]++;

A[1]=max(A[1]-A[3],0);

cout<<A[3]+A[4]+(A[1]+2*A[2]+3)/4;

return 0;

}

结论就是:代码功力太差,水平还要提升。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法