题目意思就是给你不同学生人数的组,要求一个组的人必须要在一辆车上,问你要几辆车,模拟一下
题目链接:http://codeforces.com/problemset/problem/158/B
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MIN(x,y) x<y?x:y
#define MAX(x,y) x>y?x:y
using namespace std;
const int N=110000;
int a[N];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int i,j,n,sum,p,pos,four,three,two,one;
while(~scanf("%d",&n))
{
sum=0;
four=0;
three=0;
two=0;
one=0;
pos=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==1)
one++;
if(a[i]==2)
two++;
if(a[i]==3)
three++;
if(a[i]==4)
four++;
}
// printf("%d %d %d %d\n",one,two,three,four);
sum+=four;
if(one<three)
{
sum+=one;
three=three-one;
sum+=three;
if(two%2==0)
{
sum+=(two/2);
}
else
{
sum+=(two/2+1);
}
}
else if(three<one)
{
if(three!=0)
{
sum+=three;
one=one-three;
}
if(one<two)
{
if(one%2==0)
{
one=one/2;
two+=one;
if(two%2==0)
{
sum+=two/2;
}
else
{
sum+=(two/2+1);
}
}
else
{
one=one/2;
two+=one;
if(two%2==0)
{
sum+=two/2+1;
}
else
{
sum+=(two/2+1);
}
}
}
else if(one>two)
{
if(one%2==0)
{
one=one/2;
two+=one;
if(two%2==0)
{
sum+=two/2;
}
else
{
sum+=(two/2+1);
}
// printf("%d\n",sum);
}
else
{
one=one/2;
two+=one;
if(two%2==0)
{
sum+=two/2+1;
}
else
{
sum+=(two/2+1);
}
}
}
else if(one==two)
{
sum+=one;
}
}
else if(three==one)
{
sum+=one;
if(two%2==0)
{
sum+=(two/2);
}
else
{
sum+=(two/2+1);
}
}
printf("%d\n",sum);
}
return 0;
}