• 【Day_14 0510】▲幸运的袋子


    幸运的袋子

    题目来源

    牛客网:幸运的袋子

    题目描述

    一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
    例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
    你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。

    输入描述

    第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数xi(xi ≤ 1000)

    输出描述

    输出可以产生的幸运的袋子数

    10

    示例

    输入

    3
    1 1 1

    输出

    2

    思路分析

    • 对于大于0的数,几个数的和要比积大,那么这几个数字中至少要有一个1
    • 相比于移除而言,组合数据更容易操作,所以采用遍历组合的方式
    • 对数组进行升序排序后,如果当前组合满足条件,则再追加数据,如:1,3,5,7这组数据,13满足,再进一步判断135
    • 如果前面的组合已经不满足要求,则后面不用再追加数据,同样以1,3,5,7这组数据为例,135组合已经不满足,1357也一定不满足要求

    如图:
    以1,1,2,3,5,这一组数据为例,
    11,112,1123,11235不满足,则退回上一级;1125,不满足,向上退一级;113不满足,退回上一级;115,遍历结束,退回上一级;12,123不满足退出;13,135不满足退出;15,遍历结束。
    在这里插入图片描述
    对于重复的的处理:如1,3,3,9这组数据,13,133不满足;下一个3第一个组合也是13,与前面重复。所以当下一个数与当前数相同时,直接跳过。
    在这里插入图片描述

    代码展示

    #include
    #include
    #include
    using namespace std;
    
    int GetLuck(vector<int>& v, int n, int pos, int sum, int product)
    {
        int count = 0;
        for (int i = pos; i < n; i++)
        {
            sum += v[i];
            product *= v[i];
            if (sum > product)
            {
                count += 1 + GetLuck(v, n, i + 1, sum, product);
            }
            else if (v[i] == 1)
            {
                count += GetLuck(v, n, i + 1, sum, product);
            }
            else
            {
                break;
            }
    
            //回会到上一级,
            sum -= v[i];
            product /= v[i];
            //判断是否有重复
            while (v[i] == v[i + 1] && i < n - 1)
            {
                i++;
            }
        }
        return count;
    }
    
    int main()
    {
        int n = 0;
        while (cin >> n)
        {
            vector<int> v(n);
            for (int i = 0; i < n; i++)
            {
                cin >> v[i];
            }
            //先对数组排序
            sort(v.begin(), v.end());
            cout << GetLuck(v, n, 0, 0, 1) << endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    torchvision中数据集的使用
    浏览器缓存
    ubuntu 虚拟机扩容
    【版本控制】Github和Gitlab同时使用ssh
    每日一题Day40-41
    web:[极客大挑战 2019]Upload
    打包时,模块的大小写很重要
    js逆向第二课 认识字符编码
    Workbench环境中常见问题
    聚类 Kmeans
  • 原文地址:https://blog.csdn.net/qq_44631587/article/details/126310256