2050. 【8.18】游戏

2050. 【8.18】游戏 

题目描述

“Ran,今天我要在Hakase家打游戏,不回来了。”
“Ran,Hakase新发明了游戏,我今天住博士家。”
“Ran,Conan今天要在我家通宵打游戏。”
终于有一天,电脑被打坏了……2333
所以Conan要前往专卖店买新的,正好专卖店正在促销,一共有三种礼包:
豪华礼包:一个 U盘、一个鼠标和一个机械键盘。
幸运礼包:一个 U盘、两个鼠标。
普通礼包:两个 U盘、一个鼠标。
卖店内准备了 a 个 U盘、b 个鼠标和 c 个机械键盘。为了给顾客带来足够多的惊喜,店长希望相邻两位领礼包的顾客拿到的礼包类型都是不同的。店长想知道这些奖品最多可以发出多少份礼包。可是店长毕竟没有Conan聪明,所以请教Conan,可是Conan要急着回去打游戏,所以就交给你啦。

输入

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

输出

输出到文件store.out 中。
输出T行,每行一个整数,表示最多能发出多少份礼包。

样例输入

2
4 4 0
1 1 1

样例输出

2
1

 

二分最终的答案ans,

每个礼包至少耗掉一个键盘、一个鼠标,

所以问题变成了:

豪华礼包x个:1键盘

幸运礼包y个:1U盘

普通礼包z个:1鼠标

由于相邻两位领礼包的顾客拿到的礼包类型都是不同的,所以:

x <= y+z+1

y <= x+z+1

z <= x+y+1

判断即可。

 

这应该是水解吧,我有一个自己想出来的方法,比较奇葩,不知道对不对,一开始两两大包,这样就可以无限选一种也不会错,然后让a,b差最小去做用a,b相等的方案,最后因为是两两打包,所以还有单独做一次选一个的情况能不能选

var
 a,b,c,t,min,i,j,k,ans:longint;
begin
 assign(input,'store.in'); reset(input);
 assign(output,'store.out'); rewrite(output);
 readln(t);
 fori:=1 to t do
 begin
 readln(a,b,c);
 min:=maxlongint;
 ans:=0;
  ifb>a then
  begin
   ifb-a<min then min:=b-a;
   ifc<min then min:=c;
   ifb div 3<min then min:=b div 3;
   ifa div 2<min then min:=a div 2;
  ans:=ans+min*2;
  b:=b-3*min;
  a:=a-2*min;
  c:=c-min;
  end;
 min:=maxlongint;
  ifa>b then
  begin
   ifa-b<min then min:=a-b;
   ifc<min then min:=c;
   ifb div 2<min then min:=b div 2;
   ifa div 3<min then min:=a div 3;
  ans:=ans+min*2;
  b:=b-2*min;
  a:=a-3*min;
  c:=c-min;
  end;
 min:=maxlongint;
  if(a<>0) and (b<>0) then
  begin
   ifa div 5<min then min:=a div 5;
   ifb div 5<min then min:=b div 5;
   ifc div 2<min then min:=c div 2;
  a:=a-min*5;
  b:=b-min*5;
  c:=c-min*2;
  ans:=ans+min*4;
  end;
  min:=maxlongint;
  if(a<>0) and (b<>0) then
  begin
   ifa div 3<min then min:=a div 3;
   ifb div 3<min then min:=b div 3;
  a:=a-min*3;
  b:=b-min*3;
  ans:=ans+min*2;
  end;
 min:=maxlongint;
  if(a>0) and (b>0) and (c>0) then
  begin
  a:=a-1; b:=b-1; c:=c-1;
  ans:=ans+1;
  end;
 min:=maxlongint;
  if(a>1) and (b>0) then
  begin
   a:=a-2;
  b:=b-1;
  ans:=ans+1;
  end;
 min:=maxlongint;
  if(a>0) and (b>1) then
  begin
  a:=a-1;
  b:=b-2;
  ans:=ans+1;
  end;
 writeln(ans);
 end;
 close(input); close(output);
end.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值