注册 登录
编程论坛 C++教室

我想了好久也没有想出来 求大神?

winnie96 发布于 2017-03-10 12:52, 1868 次点击

联想专卖店准备进行大促销,每位进店购买电脑的顾客都能获得奖品大礼包。一共有三种备选奖品:U盘、鼠标和机械键盘。一共有三种礼包配置:

豪华礼包:一个 U盘、一个鼠标和一个机械键盘。

幸运礼包:一个 U盘、两个鼠标。

普通礼包:两个 U盘、一个鼠标。

现在专卖店内准备了 aaa 个 U盘、bbb 个鼠标和 ccc 个机械键盘。为了给顾客带来足够多的惊喜,店长希望 相邻两位领礼包的顾客拿到的礼包类型都是不同的。店长想知道这些奖品最多可以发出多少份礼包。

输入格式

第一行一个正整数 T(1≤T≤105)T(1 \leq T \leq 10^5)T(1≤T≤10
​5
​​) 表示数据的组数。

每组数据一行三个正整数 a,b,c(0≤c≤b≤a≤105)a,b,c(0 \leq c \leq b \leq a \leq 10^5)a,b,c(0≤c≤b≤a≤10
​5
​​),表示 U盘、鼠标和机械键盘各有多少个。

所有 a,b,ca,b,ca,b,c 的总和不超过 10710^710
​7
​​。

输出格式

每组数据输出一个整数,表示最多能发出多少份礼包。



样例输入
2
4 4 0
1 1 1


样例输出
2
1
4 回复
#2
winnie962017-03-10 12:54
#include<stdio.h>
#include<stdlib.h>

int fun(int x,int y,int z)  //判断出 x,y,z 是否可以组合成不相邻的礼包
{
    if((x-1>y+z)||(y-1>x+z)||(z-1>y+z))  return 0;//能
    return 1;//不能
}
int main ()
{
    int a,b,c,num,x,y,n,z,p;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d",&a,&b,&c);
        p=0;
        
        for(x=c;x>=0;x--)  //x最多有c个
        {
            if(a>=x&&b>=x)
            for(y=(2*b-a-x)/3;y>=0;y--) //y最多有 2*b-a-x)/3
            {
                z=(a-x-y)/2>(b-x-2*y) ?(b-x-2*y):(a-x-y)/2;
                    if(fun(x,y,z)) p=x+y+z;
        }
}
      
        printf("%d\n",p);
      
      
    }
}
这是我想的   但是部分数据通不过。。我快不行了
#3
rjsp2017-03-10 14:03
总觉得 p=x+y+z; 应该是 if( p<x+y+z ) p = x+y+z;
#4
winnie962017-03-12 10:58
回复 3楼 rjsp
如果这样的话,怎样判断x,y,z, 这三种礼品不相邻?
#5
rjsp2017-03-12 12:02
以下是引用winnie96在2017-3-12 10:58:44的发言:

如果这样的话,怎样判断x,y,z, 这三种礼品不相邻?

你不是写了if((x-1>y+z)||(y-1>x+z)||(z-1>y+z)吗?
难道代码是抄的?
1