ACM算法训练【贪心合集】

简介: ACM算法训练【贪心合集】


1.区间选点(区间问题·贪心)


9a10f8abb9c74eda92f7a3cfbcd8ddd2.png


思路:

①将每个区间按右端点进行排序
②从前往后依次遍历每个区间
③如果当前区间已经被点覆盖,则pass,否则选择区间的最右边的点
④贪心的思想:每次选择局部最优点解,总体达到全部最优解(只有当问题是单峰的情况才可以使用贪心算法)


#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
vector<PII> ports;
bool cmp(PII a,PII b)   //按pair的second排序
{
    return a.second < b.second;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        ports.push_back({l,r});
    }
    sort(ports.begin(),ports.end(),cmp);
    int ans=0,ed=-2e9;
    for(auto item : ports)
        if(item.first>ed)
        {
            ans++;
            ed=item.second;
        }
    cout<<ans;
    return 0;
}


2.区间分组(区间问题·贪心)


92127b35d5784b60ae9d8e02c98f4aa4.png


思路:

①所有区间按照左端点从小到大排序
②从前往后处理每个区间,对于每个区间,判断能否将其放到某个组中(L[i] <= Max_r)
不存在这样的组,开辟一个新的组;存在这样的组,放在这个组中,并且更新当前组的Max_r


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct Range
{
    int l,r;
}range[N];
bool cmp(Range a,Range b)   //结构体自定义排序
{
    return a.l<b.l;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        range[i]={l,r};
    }
    sort(range,range+n,cmp);
    priority_queue<int,vector<int>,greater<int>> heap;  //定义小根堆
    for(int i=0;i<n;i++)
        if(heap.empty()||heap.top()>=range[i].l) heap.push(range[i].r);
        else
        {
            heap.pop();
            heap.push(range[i].r);
        }
    cout<<heap.size();
    return 0;
}


3.区间覆盖(区间问题·贪心)


89c3ef1591ea4156af6e6558e2cd2d84.png

输入样例:

1 5
3
-1 3
2 4
3 5

输出样例:

2


思路:

①将区间按左端点从小到大排序
②从前往后依次枚举每个区间,在所有能覆盖线段开头start的区间中选择一个右端点最大的
选完后将start更新成右端点的最大值


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct Range
{
    int l,r;
}range[N];
bool cmp(Range a,Range b)
{
    return a.l<b.l;
}
int main()
{
    int st,ed;
    cin>>st>>ed;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        range[i]={l,r};
    }
    sort(range,range+n,cmp);
    int res=0;
    bool flag=false;
    for(int i=0;i<n;i++)
    {
        int j=i,r=-2e9;
        while(j<n && range[j].l<=st)
        {
            r=max(r,range[j].r);
            j++;
        }
        res++;
        if(r<st) break;
        if(r>=ed)
        {
            flag=true;
            break;
        }
        i=j-1;
        st=r;
    }
    if(flag) cout<<res;
    else cout<<-1;
    return 0;
}


4.耍杂技的牛(权重相加问题·贪心)


d20ff266fa3e40049aa3bc0c3fe2200b.png


数据范围


1≤N≤50000,
1≤Wi≤10,000,
1≤Si≤1,000,000,000


输入样例:


3
10 3
2 5
3 3


输出样例:


2


思路:

按照wi+si从小到大排序排,结果一定是最优解


#include <bits/stdc++.h>
using namespace std;
const int N = 50010;
struct Cow
{
    int w,s,total;
}cow[N];
bool cmp(Cow a,Cow b)
{
    return a.total<b.total;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int w,s;
        scanf("%d%d",&w,&s);
        cow[i]={w,s,w+s};
    }
    sort(cow,cow+n,cmp);
    int ans=-2e9,sum=0;
    for(int i=0;i<n;i++)
    {
        ans=max(ans,sum-cow[i].s);
        sum+=cow[i].w;
    }
    cout<<ans;
    return 0;
}


5.合并果子(Huffman树)


在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。


达达决定把所有的果子合成一堆。


每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。


可以看出,所有的果子经过 n−1 次合并之后,就只剩下一堆了。


达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。


因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。


假定每个果子重量都为 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。


例如有 3 种果子,数目依次为 1,2,9。


可以先将 1、2 堆合并,新堆数目为 3,耗费体力为 3。


接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12,耗费体力为 12。


所以达达总共耗费体力=3+12=15。


可以证明 15 为最小的体力耗费值。


765dffef0eb04a8a951271f929a64504.png


输入样例:


3 
1 2 9


输出样例:


15


每次选权重最小的两堆合并,结果就是全局最优解


#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    priority_queue<int,vector<int>,greater<int>> heap;
    for(int i=0;i<n;i++)
    {
        int a;
        scanf("%d",&a);
        heap.push(a);
    }
    int ans=0;
    while(heap.size()>1)
    {
        int a=heap.top(); heap.pop();
        int b=heap.top(); heap.pop();
        ans+=a; ans+=b;
        heap.push(a+b);
    }
    cout<<ans;
    return 0;
}


6.排队打水(排序不等式)


cd078a8c9b834e429f98ba0d74e80cad.png

输入样例:

7
3 6 1 4 2 5 7

输出样例:

56


排序相加策略:


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);
    long long ans=0;
    for(int i=0;i<n;i++)
        ans+=a[i]*(n-i-1);
    cout<<ans;
    return 0;
}


7.货舱选址(绝对值不等式)


634a440f7bb8416cad5210eb9108821f.png


输入样例:


4
6 2 9 1


输出样例:


12


各个货舱的点距离所有货舱的中位数距离最近:


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    sort(a,a+n);
    long long ans=0;
    for(int i=0;i<n;i++)
        ans+=abs(a[i]-a[n/2]);
    cout<<ans;
    return 0;
}


目录
相关文章
|
6月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
56 1
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
54 1
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
60 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
21天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
1月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
1月前
|
算法 C++
蓝桥 算法训练 共线(C++)
蓝桥 算法训练 共线(C++)
|
4月前
knn增强数据训练
【7月更文挑战第27天】
37 10
|
4月前
|
数据采集 编解码 人工智能
破解ChatGPT惊人耗电!DeepMind新算法训练提效13倍,能耗暴降10倍
【7月更文挑战第19天】DeepMind的JEST算法革新AI训练,提升效率13倍,节能10倍。通过联合数据批次选择,预训练指导及多分辨率训练,优化资源利用,降低能耗。实验显示性能提升,达到SOTA水平,但实施需大量资源,依赖优质参考模型。[论文链接](https://arxiv.org/pdf/2406.17711)
69 10
|
4月前
knn增强数据训练
【7月更文挑战第28天】
41 2
下一篇
无影云桌面