zoukankan      html  css  js  c++  java
  • 打牌

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

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

  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/idealing/p/3747855.html
Copyright © 2011-2022 走看看