3646. 分水果
//我的写法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main() {
scanf("%d", &t);
while (t--) {
int a, b, c;
int k = 0;
scanf("%d%d%d", &a, &b, &c);
if (a)
k++, a--;
if (b)
k++, b--;
if (c)
k++, c--;
int x = 0, y = 0, z = 0;
if (a >= b && a >= c) {
x = a;
y = max(b, c);
z = min(b, c);
} else if (b >= a && b >= c) {
x = b;
y = max(a, c);
z = min(a, c);
} else if (c >= a && c >= b) {
x = c;
y = max(a, b);
z = min(a, b);
}
if (x && y)
k++, x--, y--;
if (x && z)
k++, x--, z--;
if (y && z)
k++, y--, z--;
if (x && y && z)
k++;
printf("%d\n", k);
}
return 0;
}
//y总的写法
#include <bits/stdc++.h>
using namespace std;
int s[7][3] = {{0, 0, 1}, {0, 1, 0}, {1, 0, 0}, {0, 1, 1},
{1, 0, 1}, {1, 1, 0}, {1, 1, 1}};
int main() {
int T;
cin >> T;
while (T--) {
int a, b, c;
cin >> a >> b >> c;
int res = 0;
for (int i = 0; i < 1 << 7; ++i) {
int sa = 0, sb = 0, sc = 0, cnt = 0;
for (int j = 0; j < 7; ++j)
if (i >> j & 1) {
sa += s[j][0];
sb += s[j][1];
sc += s[j][2];
cnt++;
}
if (sa <= a && sb <= b && sc <= c)
res = max(res, cnt);
}
cout << res << endl;
}
return 0;
}
题解:看到数据量那么小,大家肯定都能想到暴力枚举,我们用二进制记录选与不选的状态,也就是状态压缩。我用的是贪心吧,规律也很简单,反正就那7种可能的分法,枚举一遍就是了。