1982: D.房間安排

1982: D.房間安排

時間限制: 2 Sec  內存限制: 256 MB
提交: 243  解決: 30
[提交][狀態][討論版]

題目描述

Alice所在的社團計劃一次外出遊玩。Alice需要安排所有人入住的房間。社團一共訂了n個房間,然後Alice給第i間房間安排了ai(0<=ai<=4)個人。向旅館提交了住宿信息之後,Alice發現如果出現一個房間人數爲1或者爲2的情況,這個房間的社員就會感覺到孤獨和淒涼,會很失望。所以Alice現在想調整一下,把某些社員調到其他房間,使得所有社員都不會感到孤獨。但是爲了避免不必要的麻煩,她希望調整的人數最少。Alice向Bob求助,Bob希望你能寫個程序求出最少需要調整的人數。

注意:你可以把一個房間的初始人員都調出去,允許房間空閒,不允許某個房間人數超過4個。

輸入

第一行輸入一個整數n(1<=n<=1000000),表示預定的房間數量。

接下來一行輸入n個數,第i個數是ai(0<=ai<=4),表示第i個房間初始有ai個人。

輸出

輸出一個數,表示最少需要調整的人的數量,如果無論怎麼安排都不能滿足要求,輸出-1。

樣例輸入

51 2 2 4 340 3 0 4

樣例輸出

20

提示


第一個樣例最少需要調動2個人,將第一個房間的一個人調到第二個房間,從第四個房間調一個人到第三個房間,最後人數爲0 3 3 3 3,滿足要求。



第二個樣例不需要調動,所以答案是0

來源

第六屆河海大學程序設計大賽  

當時做了兩個多小時,硬是沒做出來,回來繼續按着思路寫,然後就ok了。

思路:

1,2,3,4的房間分別記錄下來,當1等於2的時候,正好完全補上,當1大於2時,按照剩下的1自己組成3,然後餘下的一個1或者2個1分別討論,當1小於2時,剩下的2正好3個2需要移動兩個,餘下1個2或者兩個2分別討論即可。

#include<iostream>
#include<cstring>
using namespace std;
int a[1000050];
int main()
{
	long long n;
	while(cin>>n)
	{
		long long more[5],cnt=0;
		memset(more,0,sizeof(more));
		for(long long i=1;i<=n;i++)
		{
			cin>>a[i];
			more[a[i]]++;
		}
		for(int i=1;i<=4;i++)
		{
			cnt+=more[i]*i;
		}
		if(cnt<3||cnt==5)
		{
			cout<<"-1"<<endl;
			continue;
		}
		if(more[1]==more[2])
		{
			cout<<more[1]<<endl;
			continue;
		}
		else
		{
			if(more[1]>more[2])
			{				
				int temp=more[2];
				int t=more[1]-more[2];
				temp+=t/3*2;
				if(t%3==1)
				{
					if(more[3]+more[2]+t/3>=1)
					temp++;
					else
					{
						if(more[4]>=2)
						{
							temp+=2;
						}
						else
						{
							cout<<"-1"<<endl;
							continue;
						}
					}
				}
				if(t%3==2)
				{
					if(more[4]>=1)
					{
						temp+=2;
					}
					else
					{
						if(more[3]+t/3+more[2]>=2)
						{
							temp+=2;
						}
						else
						{
							cout<<"-1"<<endl;
							continue;
						}
					}
				}
				cout<<temp<<endl;
				continue;
			}
			if(more[1]<more[2])
			{
				int temp=more[1];
				int t=more[2]-more[1];
				temp+=t/3*2;
				if(t%3==1)
				{
					if(more[4]>=1)
					temp++;
					else
					{
						if(more[3]+more[2]+t/3>=2)
						{
							temp+=2;
						}
						else
						{
							cout<<"-1"<<endl;
							continue;
						}
					}
				}
				if(t%3==2)
				{
					temp+=2;
				}
				cout<<temp<<endl;
				continue;
			}
		}
	}
	return 0;
}


發佈了122 篇原創文章 · 獲贊 92 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章