C++贪心算法

devtools/2024/10/25 5:18:39/

贪心算法

贪心的基本原理:每一步都选择局部最优解而尽量不考虑对后续的影响,最终达到全局最优解。
贪心的局限性:贪心算法不能保证获得全局最》解,但在某些问题上具有高效性。
贪心的特征:贪心选择性质()、最优子结构性质(根据我的观察,很多贪心的题目会出现“不同的操作产生的贡献相同”的特征,在此特征下我们每次选择代价最小的)。

贪心算法实现步骤:

1.确定问题的最优子结构贪心往往和排序、优先队列等一起出现)
“最小代价”。
2.构建贪心选择的策略,可能通过“分类讨论"“最大价值”等方式来思考贪心策略。简单验证贪心的正确性,采用句!般是:这样做一定不会使得结果变差、不存在比当前方案更好的方案等等。
3.通过贪心选择逐步求解问题,直到得到最终解。

例题

蓝桥杯 3412
分析:
简单排序模型。
要将战斗力分为两部分,为了使得差距最小,我们可以将战斗力排序后,找一个位置进行划分,使得左边的都在a,右边的都在b,从而这个差距就是这个位置两边的战斗力差距,说明差距的取值仅有n-1种,枚举即可。
这个题启发我们,当混乱的数据不好处理且排序不影响答案时,尝试先排序再分析

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int ans=a[2]-a[1];for(int i=1;i<n;i++){ans=min(ans,a[i+1]-a[i]);}cout<<ans;return 0;
}

蓝桥杯 545
分析:
总操作数一定情况下的最小代价模型。
我们知道这里一共需要进行的操作次数一定是n-1次,那么贪心地想,如果
每次选择代价最小的两个部落合并,不仅可以使得当前代价最小,还可以使得后续合并的代价也尽可能小。部落大小通过优先队列来维护。

代码如下:

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;// 使用 lambda 函数作为比较器auto com = [](int a, int b) {return a > b; // 小顶堆};// 定义优先队列,使用自定义的比较器priority_queue<int, vector<int>, decltype(com)> pq(com);// 输入数据并将其推入优先队列for (int i = 1; i <= n; i++) {int x;cin >> x; // 读取输入pq.push(x);}int sum = 0; // 初始化 sum// 合并过程while (pq.size() > 1) { // 确保有至少两个元素int y = pq.top();pq.pop();int z = pq.top(); // 获取下一个元素pq.pop();int ans = y + z; // 合并pq.push(ans); // 将合并后的值推入优先队列sum += ans; // 累加到 sum}cout << sum << endl; // 输出结果return 0;
}

蓝桥杯 532
分析:
最少数目的贪心模型。
为了使得组数最小,我们应该使得每一组内尽可能装两件礼物(最多只能装两件),尽量占满一组的容量。所以贪心策略是,每一个贵的礼物,带一个便宜的,因为带也是一组,不带也是一组,肯定选择带,且最贵的和最便宜的最容易占满一组

#include<bits/stdc++.h>
using namespace std;const int N=1e5+9;
int a[N];
int main()
{int w;cin>>w;int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}int ans=0;sort(a+1,a+n+1);int l=1;int r=n;while(l<=r){ans++;if(l==r){break;}if(a[l]+a[r]<=w){l++,r--;}else{r--;    }}cout<<ans<<endl;
}

蓝桥杯 2928
找规律的贪心,考验思维,将字符串分类讨论设计贪心策略。
先给字符串排序,然后我们可以分为三类讨论:
1.字符串全相等(假设全a),那就是尽量使得每个人分到的字符串的最大长度尽可能小就行。
2.s[x]==s[1],说明第x个是最小的字符带着后面所有的字符一起输出。
3.s[x]!=s[1],后面一坨字符可以直接丢到s[1]后面,分给第一个同学。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char s[N];
int main()
{int n,x;cin>>n>>x;cin>>s+1;sort(s+1,s+n+1);if(s[1]==s[n]){for(int i=1;i<=n/x+(n%x?1:0);i++){cout<<s[1];}}else if(s[x]==s[1]){for(int i=x;i<=n;i++){cout<<s[i];}}else{cout<<s[x];}return 0;
}

http://www.ppmy.cn/devtools/128601.html

相关文章

百度文心一言接入流程-java版

百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中&#xff0c;基于面积制表工具&#xff08;也就是Tabulate Area工具&#xff09;&#xff0c;基于1个面要素数据集与1个栅格数据&#xff0c;计算每一个面要素中各栅格数据分布面积的方法。 首先&#xff0c;来看一下本文的需求。现有一个矢量面的要素集…

【硬件篇】k8s云原生开发要求

k8s云原生开发对硬件有一定要求。CPU方面&#xff0c;建议至少配备2个逻辑核心&#xff0c;高性能CPU更佳。内存至少4GB&#xff0c;但8GB或更高更推荐。存储需至少20-30GB可用空间&#xff0c;SSD提升IO性能。网络要求稳定&#xff0c;建议使用私有网络VPC&#xff0c;并配置与…

计算机网络-MSTP概述

一、RSTP/STP的缺陷与不足 前面我们学习了RSTP对于STP的一些优化与快速收敛机制。但在划分VLAN的网络中运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致…

JavaScript解析JSON对象及JSON字符串

1、问题概述&#xff1f; JavaScript解析JSON对象是常用功能之一。 此处我们要明确JSON对象和JSON字符串的区别&#xff1f;否则会给我们的解析带来困扰。 主要实现如下功能&#xff1a; 1、JavaScript解析JSON字符串和JSON对象? 2、JavaScript解析JSON数组? 3、JavaSc…

python_学习2(仅为本人学习记录)

二、变量与字符串 1、变量的声明和赋值 a.变量在使用前必须要先赋值 b.删除变量&#xff0c;可以通过del语句删除。 a123 del a c.链式赋值 xy123 相当于 x123;y123 d.解包赋值 a,b,c1,2,3 相当于 a1 b2 c3 使用解包赋值给变量交换值&#xff1a;a,b3,4 a,bb,a 2、基本…

【golang】学习文档整理

Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期

重修设计模式-行为型-访问者模式

重修设计模式-行为型-访问者模式 Allows for one or more operation to be applied to a set of objects at runtime, decoupling the operations from the object structure. 允许一个或者多个操作应用到一组对象上&#xff0c;解耦操作和对象本身。 访问者模式&#xff08;Vi…