リンク:https://codeforces.com/problemset/problem/158/B
レッスン後 のn 学童のグループ外に行き、彼の誕生日を祝うためにPolycarpusを訪問することを決めました。我々はことを知っている 私番目のグループは、で構成さ sの私 の友人(1≤ sのI ≤4)、そして、彼らは一緒にPolycarpusに行きたいです。彼らはタクシーでそこに取得することを決めました。各車は、最大で4人の乗客を運ぶことができます。各グループのすべてのメンバーが同じタクシーに乗る必要があります(ただし、1台のタクシーが複数のグループを取ることができます)場合、子供は何の車の最小数が必要になりますか?
入力
最初の行は、整数含ま N (1≤ nは 学童のグループの数- ≤105)。2行目は、整数のシーケンス含ま S、1 だ 2、...、 sはN (1≤ sはI ≤4)。整数は、スペースで区切られ、 よ私は 子どもたちの数である I番目のグループ。
出力
Polycarpusにすべての子を駆動するのに必要なタクシーの最小数 - 単一の番号を印刷します。
例
入力
コピー
5 1 2 4 3 3
出力
コピー
4
入力
コピー
8 2 3 4 4 2 1 3 1
出力
コピー
5
注意
最初のテストでは、我々は次のように4台の車に子供を並べ替えることができます。
- 第三の群(4人の子供からなります)、
- 第四群(三人の子供からなります)、
- 第5群(三人の子供からなります)、
- 第一及び第二群(対応して、1と2人の子供からなります)。
4台の車の中にグループをソートする他の方法があります。
コード:
#include<bits/stdc++.h>
using namespace std;
long long n,t,l,r,k,s,d,max1=0,b,c,mod=1e9+7;
long long a[100005];
map<long long,long long>m,p;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=n,j=1;i>=j;i--)
{
if(a[i]==4||i==j)
{
s++;
}
else if(a[i]==3)
{
if(a[i]+a[j]==4)
{
s++;
a[j]=0;
j++;
}
else if(a[i]+a[j]>4)
{
s++;
}
}
else if(a[i]==2)
{
if(a[i]+a[j]==4)
{
s++;
a[j]=0;
j++;
}
else if(a[j]==1)
{
if(a[j+1]==1&&j+1<i)
{
s++;
a[j]=0;
j++;
a[j]=0;
j++;
}
else if(a[j+1]==2&&j+1<i)
{
s++;
a[j]=0;
j++;
a[j]=1;
}
else if(j+1==i)
{
s++;
break;
}
}
}
else if(a[i]==1)
{
s+=ceil((i-j+1)*1.0/4);
break;
}
}
cout<<s;
}