这是一道思维题,你用二分去做么?!
题目描述
某年某月某日,徐悦然打开了手机准备看直播,但是他忽然眼前一片白光,再次睁开眼,他来到了一个陌生的世界。
徐悦然十分冷静沉稳,便找人打探消息。
通过多方面的了解,他知道自己来了一个叫做 “徐悦然” 的星球,根据传统习俗,在这个星球上只存在三种名字,分别是:“徐”,“悦”,“然”。
他们组队行事,在3个人组成的队伍中,至少有一个人叫 “徐”、“悦”。
现在他忽然得知,只有当他知道在这个星球上最多能组成多少个队伍,他才可能回到地球继续看直播,所以他开始疯狂地询问。
已知他询问了n次,每次询问都可得知a,b,c的个数,分别代表“徐” “悦” “然”的个数。
现在,机智的你能帮帮他吗?
输入格式
输入一个n,1<=n<1000 输入n组a,b,c,1<=a,b,c<=1000000
输出格式
每组输出一个最多的组数
输入 #1
5
1 1 1
3 6 0
0 0 0
0 1 1
1 10 10
输出 #1
1
3
0
0
1
先看看第一次是怎么想的:
根据木桶原理,至多组队数=a、b中的最小数,
提交,WA 。
我们看这种情形:a=3,b=3,c=0
按照老思路,min(a, b)=3
若a,b两两匹配出3组,则再也找不出第三个队友了!
那答案是0么?
不!a,b在每组中至少各1人,至多呢?
a=2,b=1,c=0,也能成团!
这样一来:至多组队数=sum/3=2
其实,我们只需要拿 min(a, b) 和 sum/3 比较即可。
附:最简代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int n,a,b,c;
cin>>n;
while(n--)
{
cin>>a>>b>>c;
cout<<min(min(a,b),(a+b+c)/3)<<endl;
}
return 0;
}
竟是如此简洁!我竟如此愚钝!!