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;
}