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;
}