题目详情:
一群人想打斗地主和升级。已知他们已经1个、2个、3个或者4个人成为一桌了,现在要把他们全部变成3人一桌或者4人一桌,问至少移动几个人?(要保证所有人都能进行游戏)
输入格式:
多组数据,每组数据一行,包含4个整数a,b,c,d 0<=a,b,c,d<=100000000表示1个人、两个人、3个人、4个人的桌数。
输出格式:
至少移动的人数,如果不可能完成,输出-1
答题说明:
输入样例
0 1 0 1
0 0 1 0
0 1 0 0
输出样例:
1
0
-1
解释:
(1) 4人桌移动一个人取2人桌即可
(2) 不用移动
(3) 只有两个人,无法移动凑桌。
C++源代码+注释:
/**
*sum=0最小步数
*n1->1个人的数目;n2->2个人的数目;
*n3->3个人的数目;n4->4个人的数目;
*1.n1==n2 sum=n1;
*2.n1<n2 {
* ......
*}
*3.n2<n1{
* ......
*}
*/
#include<iostream>
using namespace std;
int Getnum(int num1,int num2,int num3,int num4){
int temp1=0,temp2=0,temp3=0,temp4=0;
int sum=0;//移动次数
if(num1==num2) sum=num1;
else if(num1>num2){
temp1=num1-num2;
temp2=temp1/3;//temp2剩余的人组成3人桌
temp3=temp1%3;//temp3组成3人桌后余下的人数
if(temp3){//存在下余
if(num3+num2+temp2>=temp3){//当前3人桌>=temp3
sum=num2+temp2*2+temp3;//3-->4(3人桌到4人桌,下同)
}else{//当前3人桌<temp3
if(temp3==2){
if(num4){//存在num4:4-->3
sum=num2+temp2*2+2;
}else{
sum=-1;
}
}else {
if(num4>=2){//两个4--,与temp3==1组成3
sum=num2+temp2*2+2;
//sum=2;//num2+temp2*2=0;
}else{
sum=-1;
}
}
}
}else {
sum=num2+temp2*2;
}
}
else{//num2>num1
temp1=num2-num1;
temp2=temp1*2/3;
temp3=temp1*2-temp2*3;//temp3=temp1*2%3;
if(temp3){
if(temp3==2){//证明余下一个2人桌
if(num4){//if(num4);4-->3,则是最小操作数
sum=num1+temp2+1;
}else{//num4==0
if(num1+temp2+num3>=2){//3人桌大于2;两个3-->4
sum=num1+temp2+2;
}
else sum=-1;
}
}else{//选择择最优方案
if(num1+temp2+num3>=1){//if(当前num3) 3-->4
sum=num1+temp2+1;
}else{//num3==0
if(num4>=2){//俩个4-->3,与1组成3人桌
sum=num1+temp2+2;
//sum=2;//num1+temp2=0;
}
else sum=-1;
}
}
}else{
sum=num1+temp2;
}
}
return sum;
}
int main()
{
int n1,n2,n3,n4;
while(cin>>n1>>n2>>n3>>n4){
cout<<Getnum(n1,n2,n3,n4)<<endl;
}
return 0;
}