问题描述
寒假到了,同学们一同坐火车出游。一节列车有N个隔间,一个隔间可以容纳四个人,隔间都住满了,同学们买到的票并不在一起,有的隔间没有同学,有的隔间只有一个同学,有的有两个,有的三个,有的住满了同学。如果一个隔间少于三个同学,那他(们)就会觉得十分孤单。好在可以跟别的乘客商量换座来让同学们住到同一个隔间,但劝说别人换位置是一件比较麻烦的事情,请问最少交换多少次能够让所有有同学的隔间中都有不少于三个同学?
输入格式
输入的第一行,包含一个正整数N,表示隔间的数量。
输入的第二行N个0~4的数字,表示每个隔间有多少个同学。
输出格式
一个整数,表示最少交换次数。如果无论如何交换都无法满足要求,则输出-1。
样例输入
5
1 2 2 4 3
样例输出
2
import java.util.Scanner;
public class Main {
public static void main(String [] args) {
Scanner scanner =new Scanner(System.in);
int N=scanner.nextInt();//隔间的数量
int num[]=new int[N];//记录每一个隔间内人数
int a=0;//4人隔间数目
int b=0;//3人隔间数目
int c=0;//2人隔间数目
int d=0;//1人隔间数目
int sum=0;//最少调换次数
//初始化num数组
for(int i=0;i<N;i++) {
num[i]=scanner.nextInt();
switch(num[i]) {
case 1: d++;break;
case 2: c++;break;
case 3: b++;break;
case 4: a++;break;
}
}
//分为两种情况(隔间人数与隔间数量对应关系为a:4,b:3,c:2,d:1
//第一种:c=d
if(c==d) {
sum=d;
}
else {
//1的隔间数比2的隔间数多
if(d>c) {
int temp=d-c;
switch(temp%3) {
//temp除3余0时,3个1人隔间只需要调换两次
case 0: {
sum +=(temp/3)*2+c;
break;
}
//temp除3余1时,3个1人隔间只需要调换两次,剩余一个一人隔间,需判断调换之后是否有3人间。若没有3人隔间,就不符合题意返回-1
case 1: {
b+=c;//记录将1人隔间和2人隔间调换之后,3人隔间的总数量
sum+=(temp/3)*2+c;
if(b>=1)
sum+=1;
else
sum=-1;
break;
}
//temp除3余2时,需寻找是否有两个以上的3人隔间或一个人隔间,若没有返回-1。
case 2: {
sum+=(temp/3)*2+c;
b+=c;//记录将1人隔间和2人隔间调换之后,3人隔间的总数量
if(b>=2)
sum+=2;
else {
if(a>=1) {
sum+=3;
}
else {
sum=-1;
}
}
break;
}
}
}
//第二种情况2人隔间数量比1人隔间数量多
else {
int temp=c-d;//2人隔间数量比1人隔间数量多的量
b+=d+(temp/3)*2;//3人隔间数量
switch(temp%3) {
//多余的2人隔间数量除3余0
case 0:sum+=d+(temp/3)*2;break;
//多余的2人隔间数量除3余1
case 1:{
if(a>=1) {
sum+=d+(temp/3)*2+1;
}
else {
if(b>=2) {
sum+=d+(temp/3)*2+2;
}
else {
sum=-1;
}
}
break;
}
case 2:
sum+=d+(temp/3)*2+2;
break;
}
}
}
System.out.println(sum);
}
}
