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.