题意:
3 种人各c,m,x 个, 要求3人一队, c至少一个,m至少一个,x可有可无。问:最多能组成多少队。
公式推导 :
组合完美队伍
标准:c至少一个,m至少一个,x可有可无;
思路:首先我们最多只能是是min(c,m);
if(x>=min(c,m)) a=min(c,m);直接输出a
else{
先构成x个完美队伍。
则 数学家 :c-x 程序员:m-x
假设在这些人中 可以构成 T个完美队伍而一个队伍至少三个人
得: c-x>=T,m-x>=T,c-x+m-x>=3T;
然后我们先给这T个队伍每个队伍分配一个人;
得:c-x+m-x-T>=2T ==>c+m-2x>=3T
{ c-x>=T
m-x>=T =>T=min(c-x,m-x,(c+m-2x)/3)
c+m-2x>=3T
}
因为原本有x个队伍 =>T=min(c,m,(c+m+x)/3)
}
推广: a,b,c至少有一个,x可有可无;
思路: 首先我们最多只能是是min(a,b,c);
if(x>=min(a,b,c)) 直接输出min(a,b,c);
else{
先构成x个完美队伍。
则 数学家 :a-x 程序员:b-x 小姐姐;c-x;
假设在这些人中 可以构成 T个完美队伍
得: a-x+b-x+c-x>=4T;
然后我们先给这T个队伍每个队伍分配一个人;
a-x+b-x+c-x-T>=3T; ==>a+b+c-3x>=4T
{
a-x>=T
b-x>=T =>T=min(a-x,b-x,c-x,(c+m-3x)/4)
c-x>=T
c+m-3x>=4T
}
因为原本有x个队伍 =>T=min(a,b,c,(a+b+c+x)/4);
}
同理 a,b,c......n-1至少一样,n可有可无 =>T=min(a,b,c,,,,n-1,min(a+b+c+....+n)/n)
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int q,c,m,x;
int main()
{
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&c,&m,&x);
printf("%d\n",min(min(c,m),(c+m+x)/3));
}
return 0;
}