打牌
一群人想打斗地主和升级。已知他们已经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; }
不知自己的思路对不对,考虑的周不周全