• 贪心算法C++


    一、分发饼干

        1、题目:

    假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

    对每个孩子 i,都有一个胃口值  g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

        2、代码:

    #include
    #include
    using namespace std;
    const int N = 3 * 1e5;
    int s[N];
    int g[N];
    int n, m;
    int main() {
        cin >> n, m;
        for (int i = 0; i < n; i++) {
            cin >> s[i];
        }
        for (int j = 0; j < m; j++) {
            cin >> g[j];
        }
        sort(s,s+n);
        sort(g,g+m);
        int result = 0;
        int index = m - 1;
        for (int j = m-1; j >=0; j--) {
            while (index >= 0 && s[index] >= g[j]) {
                result++;
                index--;
            }
        }
        cout << result;
        return 0;
    }

    二、摆动序列

        1、题目:

    给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

        2、代码:

    #include
    using namespace std;
    int nums[1010];
    int n;
    int main() {
        cin >> n;
        for (int i = n; i < n; i++) {
            cin >> nums[i];
        }
        if (n <= 0) {
            cout << n;
        }
        int prediff = 0;
        int curdiff = 0;
        int result = 1;
        for (int i = 1; i < n - 1; i++) {
            curdiff = nums[i +1] - nums[i];
            if (prediff <= 0 && curdiff > 0|| prediff >= 0 && curdiff < 0) {
                result++;
            }
            prediff = curdiff;
        }
        cout << result;
        return 0;
    }


    三、最大连续子序列和

        1、题目:

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

        2、代码:

    #include
    using namespace std;
    const int N = 1e6;
    int n;
    int nums[N];
    int mian() {
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> nums[i];
        }
        if (n == 0) {
            cout << 0;
        }
        int count = 0;
        int result = INT_MIN;
        for (int i = 0; i < n; i++) {
            count += nums[i];
            if (count > result) {
                result = count;
            }
            if (count <=0) {
                count = 0;
            }
        }
        cout << result;
        return 0;
    }

    四、k次取反后最大化数组和

        1、题目:

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)

    以这种方式修改数组后,返回数组可能的最大和。

        2、代码

    #include
    #include
    using namespace std;
    int nums[100010];
    int n,k;
    bool cmp(int a, int b) {
        for (int i = 0; i < n; i++) {
            if (nums[i] < 0) {
                nums[i] *= -1;
            }
        }
        return nums[a] > nums[b];
    }
    int mian() {
        cin >> n>>k;
        for (int i = 0; i < n; i++) {
            cin >> nums[i];
        }
        sort(nums, nums + n, cmp);
        for (int i = 0; i < n; i++) {
            if (nums[i] < 0&&k>0) {
                nums[i] *= -1;
                k--;
            }
        }
        if (k %2==1) {
            nums[n - 1] *= -1;
        }
        int result = 0;
        for (int i = 0; i < n; i++) {
            result += nums[i];
        }
        cout << result;
        return 0;
    }

  • 相关阅读:
    五种常见的IO模型
    React基础
    R 语言降维的 PCA 与自动编码器
    Matlab时间序列趋势分析与预测技术
    如何判断一个市场营销(Marketing)人员的专业能力?
    一.使用qt creator 设计显示GUI
    JavaWeb学习(4)注解案例:简单的测试框架
    卫星/RedCap/高算力/解决方案/创新金奖……移远通信为IOTE 2023再添新活力
    java设计模式之装饰者模式
    QT添加右键菜单(二):QWidget的右键菜单策略
  • 原文地址:https://blog.csdn.net/2302_76979008/article/details/136975444