CF1313A 分水果

题目描述

现在有 a 个苹果,b 个香蕉,c 个橘子。

你要将这些水果分给尽可能多的小朋友。

假设一个小朋友分到的苹果数量为 x,香蕉数量为 y,橘子数量为 z。

在分发水果时,需要满足:

每个小朋友至少要分到一个水果,即 x+y+z≥1。
每个小朋友分到的苹果数量不得超过 1,香蕉数量不得超过 1,橘子数量不得超过 1,即 0≤x,y,z≤1。
任意两个小朋友分到的水果均不完全相同,即所有三元组 (x,y,z) 互不相同。
请问,最多可以将水果分给多少个小朋友。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含三个整数 a,b,c。

输出格式

每组数据输出一行结果,表示可以分到水果的小朋友的最大数量。

数据范围

1≤t≤500,
0≤a,b,c≤10

输入样例:

7
1 2 1
0 0 0
9 1 7
2 2 3
2 3 2
3 2 2
4 4 4

输出样例:

3
0
4
5
5
5
7

解题思路

从题目含义,我们可知,总共3种水果,每个水果最多只有0(不选),1(选)这2种情况,那么我们可知最多只有7种情况,即无论孩子有多少个,最多只能分给7个孩子。
那么,我们如果将这7种情况枚举出来,最多也只有2^7-1 = 127种组合方式(0,0,0这种方式不符合题意所以排除掉)。所以我们可以利用二进制枚举的方式对所有情况进行枚举,挑选出符合条件的最多孩子的情况。

代码

#include <iostream>
#include <algorithm>
using namespace std;

//打表,先将所有情况表示出来
int s[7][3] = {
    {0,0,1},
    {0,1,0},
    {0,1,1},
    {1,0,0},
    {1,0,1},
    {1,1,0},
    {1,1,1}
};

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int a,b,c,res = 0;
        cin>>a>>b>>c;
        for(int i = 1; i <= (1 << 7) - 1; i++)
        {
            int cnt_a = 0, cnt_b = 0, cnt_c = 0,cnt = 0;
            for(int j = 0; j<7; j++)
            {
                if(i>>j & 1)
                {
                    cnt_a += s[j][0];
                    cnt_b += s[j][1];
                    cnt_c += s[j][2];
                    cnt++;
                }
            }
            if(cnt_a <= a && cnt_b <= b && cnt_c <= c)
                res = max(res, cnt);
        }
        cout<<res<<endl;
    }
    return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注