Codeforces Problem-158B Taxi
基本思想:
本题是一道思维题,主要说一下这个贪心算法:
假设人数为1的有w组、人数为2的有x组、人数为3的有y组、人数为4的有z组。
1. 当人数为4,直接ans++,即ans=z;
2. 当人数为3,ans++,如果这时候有人数为1的,顺带把1也带上,即y–,再判断w是否大于0,若成立则w–;
3. 当人数为2,ans+=x/2,然后判断一下有无剩余的,若有,则把人数为1的带上,这里强调一下,如果w<0也没关系,因为这个时候前面的都已分配完,剩下的这两个人也只能单独需要一辆车;
4. 若还有人数为1的,把他们凑在一起即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n;
int a[100005];
int w=0,x=0,y=0,z=0;
memset(a,0,sizeof(a));
cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i];
if (a[i]==1)
w++;
else if (a[i]==2)
x++;
else if (a[i]==3)
y++;
else if (a[i]==4)
z++;
}
int ans=z;
while (y)
{
ans++;
y--;
if (w>0)
w--;
}
ans+=x/2;
if (x%2!=0)
{
ans++;
w-=2;
}
if (w>0)
ans+=(w%4==0?w/4:w/4+1);
cout<<ans<<endl;
return 0;
}