题意:
有n个车箱,每个车箱有x(0<=x<=4)个人,若某个车箱的人为1或2个,则该车箱的人会愤怒,因此要说服一些人换车箱,使得所有的车箱的人为0或3或4,问需要说服的最少的人数是多少。若没有可以满足的情况输出-1;
思路:
用的是贪心的思路,由1到2可理解为动1个人可以解决2个车箱的问题,比例为2;由(2,2,2)三个车箱调配的话可理解为动2个人解决3个车箱的问题,比例为1.5;
同理(1,1,1)比例为1.5;其它的依此类推,先处理比例高的,再处理比例低的。
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int main()
{
int n,i,ans;
while(scanf("%d",&n)!=EOF)
{
int a[5]={0};
ans=0;
while(n--)
{
scanf("%d",&i);
a[i]++;
}
if(a[1]>=a[2])
{
ans+=a[2];
a[1]-=ans;
a[2]-=ans;
a[3]+=ans;
int k=a[1]/3;
ans+=k*2;
a[3]+=k;
if(a[1]%3==0)
printf("%d\n",ans);
else
if(a[1]%3==1)
{
if(a[3]>0)
printf("%d\n",ans+1);
else
{
if(a[4]>1)printf("%d\n",ans+2);
else printf("-1\n");
}
}
else
if(a[1]%3==2)
{
if(a[4]>0)
printf("%d\n",ans+2);
else
{
if(a[3]>1)printf("%d\n",ans+2);
else printf("-1\n");
}
}
}
else
{
ans+=a[1];
a[2]-=ans;
a[3]+=ans;
int k=a[2]/3;
ans+=k*2;
a[3]+=k*2;
if(a[2]%3==0)printf("%d\n",ans);
else
if(a[2]%3==1)
{
if(a[4]>0)printf("%d\n",ans+1);
else
if(a[3]>1)printf("%d\n",ans+2);
else
printf("-1\n");
}
else
printf("%d\n",ans+2);
}
}
return 0;
}