您的位置:首页 > 其它

Codeforces Round #207 (Div. 1)  C. Compartments (贪心)

2013-10-23 20:40 495 查看
codeforces题目

题意:

有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: