B.タクシー

リンク: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;
} 

 

公開された137元の記事 ウォン称賛15 ビュー9918

おすすめ

転載: blog.csdn.net/Luoriliming/article/details/104002864