链接:https://www.nowcoder.com/acm/contest/78/F
来源:牛客网
今天是某不愿透露姓名的谈姓大佬的生日,转发这场比赛到三个群就可以,获得以下三种礼包之一。
豪华礼包:一个U盘、一个鼠标和一个机械键盘。
幸运礼包:一个U盘、两个鼠标。
普通礼包:两个U盘、一个鼠标。
大佬一共准备了a个U盘、b个鼠标和c个机械键盘。为了给更多的人带来足够多的惊喜,大佬希望相邻的两位领礼包的参赛选手拿到的礼包类型都是不同的。
由于大佬正在宴请Final选手,并没有空打理这些,所以想让你告诉他 这些奖品最多可以发出多少份礼包
输入描述
输入第一行包含一个正整数T。
接下来T行每行包含3个正整数a, b, c,依次表示U盘、鼠标和机械键盘各有多少个
输出描述
输出T行,每行一个整数,表示最多能发出多少份礼包
输入
2
4 4 0
1 1 1
输出
2
1
备注
T<=100000
0<=a,b,c<=1000000
这题难点在于相邻的两位领礼包的参赛选手拿到的礼包类型都是不同的
所以要控制三种礼包的数量,满足(A+B)>=ans>>1&&(B+C)>=ans>>1&&(A+C)>=ans>>1
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int l=0,r=10000000;
while (l+1<r)
{
int ans=(l+r)>>1,A=a-ans,B=b-ans,C=c;
if (A>=0&&B>=0&&A+B+C>=ans&&(A+B)>=ans>>1&&(B+C)>=ans>>1&&(A+C)>=ans>>1)
l=ans;
else r=ans;
}
printf("%d\n",l);
}
return 0;
}