打牌

一群人想打斗地主和升级。已知他们已经1个、2个、3个或者4个人成为一桌了,现在要把他们全部变成3人一桌或者4人一桌,问至少移动几个人?(要保证所有人都能进行游戏) 输入格式: 多组数据,每组数据一行,包含4个整数a,b,c,d 0<=a,b,c,d<=100000000表示1个人、两个人、3个人、4个人的桌数。 输出格式: 至少移动的人数,如果不可能完成,输出-1

#include<stdio.h>
int getMinCount(int* m)
{
    int sum = m[0]*1+m[1]*2+m[2]*3+m[3]*4;
    int ms = 0;
    //首先判断参加游戏的人数是否可以分成每桌3人或者4人
    //简单的思想是每桌先3人,然后将多余的分到每桌
    //如果剩余的人数多余桌数,则说明参加游戏的人数不满足要求
    //也可以简单的写成sum > 5这样的判断
    if(sum % 3 > sum / 3)
        ms = -1;
    //如果1人桌的个数大于2人桌,则先将2人桌凑成3人桌,
    //然后将多余的1人桌合并成3人桌(比4人桌要少移动)
    if(m[0] >= m[1])
    {
        ms = m[1] + (m[0]-m[1])/3 * 2 + (m[0]-m[1])%3;
     }
    else
    {
        //如果2人桌的个数小于1人桌和4人桌,
        //则可以移动1人桌,拆4人桌的1人与2人桌合并
        //这样最多移动m[1]个
        if(m[1] <= m[0] + m[2])
            ms = m[1];
        //如果2人桌多于1人桌和4人桌,则先将1人桌合并到2人桌,
        //然后拆分4人桌,合并到2人桌,然后将多余的2人桌拆分,
        else
            ms = (m[1] - m[0] - m[2]) * 2 / 3 + m[0] + m[2] + ((m[1] - m[0] - m[2]) * 2) / 3 ;
    }
    return ms;
}

int main(){
    int a[] = {3,300,3,4};
    int ms = getMinCount(a);
    printf("minCount is %d",ms);
    return 0;
}

不知自己的思路对不对,考虑的周不周全

posted @ 2014-05-23 15:37  idealing  阅读(302)  评论(0编辑  收藏  举报