首页 > 其他分享 >贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式——AcWing 125. 耍杂技的牛

时间:2024-06-23 16:57:53浏览次数:3  
标签:PII cow int res sum 125 最优 AcWing 贪心

贪心推公式

定义

贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,希望通过局部的最优选择来得到全局最优解的算法策略。

运用情况

  • 问题具有最优子结构,即一个问题的最优解包含其子问题的最优解。
  • 可以通过局部最优决策逐步推导到全局最优。
  • 问题的选择策略相对明确且易于计算。

注意事项

  • 贪心算法并不总是能得到全局最优解,可能会陷入局部最优。
  • 对于一些复杂问题,需要谨慎验证其正确性。
  • 可能需要对问题进行深入分析和特殊处理,以确保贪心策略的有效性。

解题思路

  • 明确问题的目标和约束条件。
  • 找出每一步的局部最优选择策略。
  • 按照贪心策略逐步进行选择和计算。
  • 验证最终结果是否符合预期,必要时进行调整或证明其正确性。

AcWing 125. 耍杂技的牛

题目描述

AcWing 125. 耍杂技的牛 - AcWing

运行代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 50010;
int n;
PII cow[N];
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int s, w;
        scanf("%d%d", &w, &s);
        cow[i] = {w + s, w};
    }
    sort(cow, cow + n);
    int res = -2e9, sum = 0;
    for (int i = 0; i < n; i ++ )
    {
        int s = cow[i].first - cow[i].second, w = cow[i].second;
        res = max(res, sum - s);
        sum += w;
    }
    printf("%d\n", res);
    return 0;
}

代码思路

  • 定义了一个 PII 类型来表示奶牛的信息(重量和强度之和以及重量)。
  • 读取每头奶牛的重量和强度,计算并存储相关信息到数组 cow 中。
  • 对 cow 数组按第一维(重量和强度之和)进行排序。
  • 通过遍历计算每一步的风险值(当前总重量减去当前奶牛的强度),并更新最大风险值的最小值。

改进思路

  • 错误处理:可以添加一些输入错误检查,例如检查输入的 n 是否合理,以及输入的重量和强度值是否符合要求。
  • 内存优化:如果可能的话,可以考虑动态分配 cow 数组,以避免在不需要处理大量数据时浪费固定的较大内存空间。
  • 代码结构优化:可以将数据读取、处理和输出的部分进一步划分清晰,提高代码的组织性。
  • 性能微优化:虽然当前的排序和计算逻辑已经较为高效,但可以研究是否有更适合特定场景的优化方法。
  • 使用 C++ 输入输出流:如前面提到的,可以将 scanf 和 printf 替换为 cin 和 cout,使代码风格更一致和现代。

改进代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 50010;

int n;
PII cow[N];

int main() {
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        int s, w;
        scanf("%d%d", &w, &s);
        cow[i] = make_pair(w + s, w);
    }

    sort(cow, cow + n, [](const PII& a, const PII& b) {
        return a.first < b.first || (a.first == b.first && a.second < b.second);
    });

    int res = -2e9, sum = 0;

    for (int i = 0; i < n; i++) {
        int s = cow[i].first - cow[i].second, w = cow[i].second;
        res = max(res, sum - s);
        sum += w;
    }

    printf("%d\n", res);

    return 0;
}

代码思路

  • 首先定义了一些常量和数据结构,包括表示奶牛信息的 PII 以及数组 cow
  • 在 main 函数中,通过 scanf 读取奶牛的数量 n 。
  • 接着循环读取每头奶牛的重量 w 和强度 s,并将它们的和与重量组成 PII 存入 cow 数组。
  • 使用自定义的比较函数对 cow 数组进行排序,优先按和的大小排序,和相同时按重量大小排序。
  • 初始化结果 res 为一个极小值,以及总重量 sum 为 0 。
  • 然后通过遍历排序后的数组,计算每一步的风险值(当前总重量减去当前奶牛的强度),并与当前的最大风险值比较更新,同时更新总重量。
  • 最后将计算得到的最大风险值的最小值输出。

标签:PII,cow,int,res,sum,125,最优,AcWing,贪心
From: https://blog.csdn.net/u014114223/article/details/139879345

相关文章

  • AcWing算法基础课笔记——求组合数3
    求组合数Ⅲ20万组数据,1≤b≤a≤1......
  • AcWing算法基础课笔记——高斯消元
    高斯消元用来求解方程组a11x1+......
  • AcWing算法基础课笔记——求组合数2
    求组合数Ⅱ1万组数据,1≤b≤a≤1......
  • Leetcode 力扣 125. 验证回文串 (抖音号:708231408)
    如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。示例1:输入:s="Aman,aplan,......
  • AcWing算法基础课笔记——求组合数1
    求组合数Ⅰ10万组数据,1≤b≤a≤2000......
  • AcWing 5726. 连续子序列
    5726.连续子序列-AcWing题库01trie的不错的练习题。题目说了求一段连续子序列的异或和,因为异或有结合律,所以我们可以直接预处理一个前缀异或和,即\(a[l,r]=sum[r]\operatorname{xor}sum[l-1]\)。然后求一段异或和就变成了求任意两个\(sum\)的异或和,而这就可以用到0......
  • LeetCode 2542. 最大子序列的分数(贪心、小顶堆)
    2542.最大子序列的分数思路:先对nums2按降序排列,然后遍历nums2的最小值,同时在区间[0,i]中选中k个最大的nums1即可。然后找出最大的ansclassSolution{public:typedefpair<int,int>PII;longlongmaxScore(vector<int>&nums1,vector<int>&nums2,intk)......
  • (nice!!!)LeetCode LCP 20. 快速公交(记忆化搜索+小顶堆+贪心)
    LCP20.快速公交思路:逆向记忆化搜索。思考从target到0所花的最小时间。通过哈希表来进行记忆化搜索,避免重复遍历。细节看注释classSolution{public:typedeflonglongLL;typedefpair<LL,LL>PII;constintmod=1e9+7;intbusRapidTransit(int......
  • 树形DP——AcWing 285. 没有上司的舞会
    目录树形DP定义运用情况注意事项解题思路AcWing285.没有上司的舞会 题目描述运行代码代码思路改进思路改进代码(AI)其它代码代码思路树形DP定义树形DP是在树上进行的动态规划。它利用树的结构特点,通过递归或迭代的方式,在每个节点上进行状态计算和转移,以求......
  • 数位统计DP——AcWing 338. 计数问题
    数位统计DP定义数位DP(DigitalDP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。运用情况统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。计算......