首页 > 试题广场 >

三色球

[编程题]三色球
  • 热度指数:814 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

有红、黄、蓝三种颜色的气球。

在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。

2个红气球+1个黄气球可以兑换1个蓝气球。

2个黄气球+1个蓝气球可以兑换1个红气球。

2个蓝气球+1个红气球可以兑换1个黄气球。

现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。
示例1

输入

1,7,5

输出

3

说明

可以用4个黄气球和2个蓝气球换2个红气球,这样就有了3个红气球,3个黄气球,3个蓝气球,可以换3个彩票。

备注:
第一个参数a代表红气球个数
第二个参数b代表黄气球个数
第三个参数c代表蓝气球个数
测试数据有问题吧?
发表于 2020-04-01 10:23:59 回复(0)
class Solution {
public:
    /**
     * 三色球
     * @param a int整型 
     * @param b int整型 
     * @param c int整型 
     * @return int整型
     */
    int solve(int a, int b, int c) {
        int m = min(a, min(b, c)), s=m;
        a -= m; b -= m; c -= m;
        if(a==0)
            return s + min(b/3, c/2);
        else if(b==0)
            return s + min(c/3, a/2);
        else if(c==0)
            return s + min(a/3, b/2);
        return s;
    }
};

发表于 2020-08-20 01:15:05 回复(0)
思路:让某个数量最小的颜色球变为0,再将其他两种球转为数量最小的球。
假设要转换x个球,并且是红球最小的情况下。
b-2*x>=x
c-x>=x
得到x需要满足Math.min(b/3,c/2);




import java.util.*;


public class Solution {
    public int solve (int a, int b, int c) {
        // write code here
        int[] arr = new int[3];
        arr[0] = a;
        arr[1] = b;
        arr[2] = c;
        Arrays.sort(arr);
        int res = 0;
        // 红最小
        res += arr[0];
        arr[1] -= arr[0];
        arr[2] -= arr[0];  
        if(arr[0] == a){
            if(b == (arr[1]+res)){
                res += (Math.min(arr[1]/3,arr[2]/2));
            }else{
                res += (Math.min(arr[2]/3,arr[1]/2));
            }
            // 黄色最小
        }else if(arr[0] == b){
            if(c == (arr[1]+res)){
                res += (Math.min(arr[1]/3,arr[2]/2));
            }else res += (Math.min(arr[1]/2,arr[2]/3));       
        }else if(arr[0] == c){
            if(a == (arr[1]+res)){
                res += (Math.min(arr[1]/3,arr[2]/2));
            }else res+=(Math.min(arr[1]/2,arr[2]/3));
        }
        return res;
    }
}

发表于 2022-08-11 16:47:09 回复(0)
贪心算法求解,先求出1 + 1 + 1 = 1彩票的情况。那么剩下的只有两个颜色的气球了, 据题意得: 2红 + 1黄= 1蓝,即3红 + 2黄 = 1彩票,同理,3黄 + 1蓝 = 1彩票,3蓝 + 2 红 = 1彩票。根据此式计算剩下的气球兑换彩票的张数,代码如下:
int three_min(int a, int b, int c){
        return a < b ? (a < c ? a : c) : (b < c ? b : c);
    }

    int two_color_ball(int fst, int sec){
        int count = 0;
        while(fst > 0 && sec > 0){
            fst -= 3;
            sec -= 2;
            if(fst >= 0 && sec >= 0){
                count++;
            }
        }
        return count;
    }
    int solve(int a, int b, int c) {
        // write code here
        int res = three_min(a, b, c);
        a -= res, b -= res, c -= res;
        if( a == 0){
            res += two_color_ball(b, c);
        }else if(b == 0){
            res += two_color_ball(c, a);
        }else {
            res += two_color_ball(a, b);
        }
        return res;
    }
代码已通过全部测试样例。
发表于 2020-07-07 10:14:31 回复(0)

问题信息

难度:
4条回答 5401浏览

热门推荐

通过挑战的用户

查看代码