您的位置:首页 > 其它

常州大学新生寒假训练会试 F-大佬的生日大礼包

2018-03-04 10:27 253 查看
链接:https://www.nowcoder.com/acm/contest/78/F
来源:牛客网

题目描述

今天是某不愿透露姓名的谈姓大佬的生日,转发这场比赛到三个群就可以,获得以下三种礼包之一。 豪华礼包:一个U盘、一个鼠标和一个机械键盘。
幸运礼包:一个U盘、两个鼠标。
普通礼包:两个U盘、一个鼠标。
大佬一共准备了a个U盘、b个鼠标和c个机械键盘。为了给更多的人带来足够多的惊喜,大佬希望相邻的两位领礼包的参赛选手拿到的礼包类型都是不同的。 由于大佬正在宴请Final选手,并没有空打理这些,所以想让你告诉他 这些奖品最多可以发出多少份礼包。

输入描述:

输入第一行包含一个正整数T。
接下来T行每行包含3个正整数a, b, c,依次表示U盘、鼠标和机械键盘各有多少个。

输出描述:

输出T行,每行一个整数,表示最多能发出多少份礼包。题解:
不能有连续的礼包,即总礼包共有x个,对于任意礼包
若x为偶数,则任意礼包不超过x/2,若x为奇数,则不超
过x/2+1。
因此便可以二分x求解,对于任意礼包都有一个鼠标
和一个U盘,而对于1礼包只需多加一个键盘,2礼包
多加一个鼠标,3礼包多加一个U盘。

代码:

#include<bits/stdc++.h>
using namespace std;
bool yes(int m,int a,int b,int c)
{
int ans=0;
int tt;
if(m%2)tt=m/2+1;
else tt=m/2;
ans+=min(tt,a);
ans+=min(tt,b);
ans+=min(tt,c);
if(ans>=m)return 1;
return 0;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
int l=0,r=min(a,b)+1;
while(r-l>1)
{
int m=(l+r)>>1;
if(yes(m,a-m,b-m,c))l=m;
else r=m;
}
printf("%d\n",l);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: