CSDN线上编程挑战5月份月赛题目:打牌

题目详情:

一群人想打斗地主和升级。已知他们已经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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值