题意:一个三元组至少包含一个a,一个b,现给你a,b,c的个数,问最多能组成几个三元组?
思路:从贪心的角度看,三元组<a,b,c>是最优的,当a-min(a,b,c)==0 || b-min(a,b,c)==0,则答案是min(a,b)
对剩下的a,b,我假设它们能组成的三元组个数为x0,则可以得到三个不等式 1) a-x0>=0 2)b-x0>=0 3)a+b-3x0>=0,可以考虑二分x0的个数,x0合法当且仅当满足这三个不等式
#include<cstdio>
#include<algorithm>
using namespace std;
bool solve(int x, int y, int x0) {
if(x - x0 < 0 || y - x0 < 0 || x + y - 3 * x0 < 0 )
return false;
return true;
}
int main() {
int n;
scanf("%d", &n);
while(n--) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
int p = min(x, min(y, z));
x = x - p;
y = y - p;
if(!x || !y)
printf("%d\n", min(x, y));
else {
int L = 1;
int R = max(x, y);
while(L <= R) {
int M = (L + R) / 2;
if(solve(x, y, M))
L = M + 1;
else
R = M - 1;
}
printf("%d\n", L - 1 + p);
}
}
return 0;
}