浅谈一类反悔贪心的问题

news/2024/11/27 22:30:35/

种树

在长度为 n n n 的数列中选择至少 k k k 个数字,他们都有价值,使得没有相邻的数字被取到,且数字之和最大。

求这个最大的数字之和。

我们考虑一个反悔贪心,首先用一个链表来维护数列,然后,每次贪心的选择最大的数字,并标记左右不可用。

但是这个贪心显然是错的,我们再直接将这三个数字合并为一个,价值为 a L + a R − a i a_L+a_R-a_i aL+aRai,意思大家应该懂。

显然这个数字,选择它相当于改选 a i a_i ai 两边的数字,这就是我们的反悔了。

再加上一个大根堆维护即可。

需要注意的是,其实这里我们选择的数字不一定是答案方案中的数字,而是我们不断启用反悔机制,不断算上增量,得到最终答案。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
priority_queue<pair<LL,LL> >p;
const LL N=1e6;
LL n,k,a[N],L[N],R[N],len,vis[N],ans;
int main()
{scanf("%lld%lld",&n,&k);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);p.push({a[i],i});L[i]=i-1,R[i]=i+1;} len=n+1;for(int i=1;i<=k;i++){while(!p.empty()&&vis[p.top().second]==1)p.pop();//无法选的if(p.empty()||p.top().first<0)break;//无法选或者选只能变小LL t=p.top().second,v=p.top().first;ans+=v;p.pop();LL l=L[t],r=R[t];vis[t]=1,vis[l]=1,vis[r]=1;//标记a[++len]=a[r]+a[l]-a[t];L[len]=L[l],R[len]=R[r],R[L[l]]=len,L[R[r]]=len;//合并处理p.push({a[len],len});}printf("%lld",ans);
} 

种树 2

在长度为 n n n 的环中选择至少 k k k 个数字,他们都有价值,使得没有相邻的数字被取到,且数字之和最大。

求这个最大的数字之和。

其实当你思考上一个问题的时候,你就会觉得这个链表很有意思,是时候展示链表的含金量了。

我们利用链表的特性,将数组首尾相连即可。

我们只需要添加以下代码:

L[1]=n,R[n]=1;

种树 3

在长度为 n n n 的环中强制选择 k k k 个数字,他们都有价值,使得没有相邻的数字被取到,且数字之和最大。

求这个最大的数字之和。

如果无解输出 Error!

依然是一个变化不大的题,首先,如何判断无解,根据限定条件,易得:

if(n<2*k)
{puts("Error!");return 0; 
}

添加至输入后即可。

注意到源代码中有这样一行:

if(p.empty()||p.top().first<0)break;//无法选或者选只能变小

无解已经判定了,这道题强制选择 k k k 个,所以删去即可。

核心代码如下:

for(int i=1;i<=k;i++)
{while(!p.empty()&&vis[p.top().second]==1)p.pop();LL t=p.top().second,v=p.top().first;ans+=v;p.pop();LL l=L[t],r=R[t];vis[t]=1,vis[l]=1,vis[r]=1;a[++len]=a[r]+a[l]-a[t];L[len]=L[l],R[len]=R[r],R[L[l]]=len,L[R[r]]=len;p.push({a[len],len});
}

Guard Duty

给定 n n n个时间点。每个区间都以某两个时间点为左右端点,且每个区间的代价定义为端点的时间之差。

你要选择 k k k 个连续的区间,保证这个 k k k 个连续的区间没有交集,且代价总和最小。

直觉告诉我们应该从大到小排一个序,然后选相邻的数字,这样代价最小,且这一点显然,在此不证明。

我们用差分处理出相邻的数字形成区间的价值,然后我们发现这里相邻的区间占有相同的点,不可同时选择,也就是相邻的区间不可选择。

那这个反悔贪心就很显然了。

注意这里是最小值,所以你需要搞一个小根堆,而且左右边界要附一个较大的值。

#include<bits/stdc++.h>
#define LL long long
#define T pair<LL,LL>
using namespace std;
priority_queue<T,vector<T>,greater<T> >p;
const LL N=1e6;
LL n,k,a[N],L[N],R[N],len,vis[N],ans;
int main()
{scanf("%lld%lld",&k,&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}sort(a+1,a+n+1);for(int i=1;i<n;i++){a[i]=a[i+1]-a[i]; p.push({a[i],i});L[i]=i-1,R[i]=i+1;} a[0]=a[n]=1e18;len=n;for(int i=1;i<=k;i++){while(!p.empty()&&vis[p.top().second]==1)p.pop();LL t=p.top().second,v=p.top().first;ans+=v;p.pop();LL l=L[t],r=R[t];vis[t]=1,vis[l]=1,vis[r]=1;a[++len]=a[r]+a[l]-a[t];L[len]=L[l],R[len]=R[r],R[L[l]]=len,L[R[r]]=len;p.push({a[len],len});}printf("%lld",ans);
} 

http://www.ppmy.cn/news/65364.html

相关文章

使用快照启动 Polygon 主网节点

文章目录 一、 环境部署1.1 golang环境部署1.2 git安装1.3 gcc安装1.4 zstd 安装1.5 pv 安装1.6 aria2c 安装二、安装 polygon2.1 heimdall 安装2.1.1 heimdall 编译2.1.2 初始化 heimdall2.1.3 修改配置文件2.2 bor 安装2.2.1 bor 编译2.2.2 创建bor数据目录2.2.3 修改配置文件…

小猪,信息论与我们的生活

前言 动态规划是大家都熟悉与陌生的知识&#xff0c;非常灵活多变&#xff0c;我自己也不敢说自己掌握了&#xff0c;今天给大家介绍一道题&#xff0c;不仅局限于动态规划做题&#xff0c;还会上升到信息论&#xff0c;乃至于启发自己认知世界的角度 因为比较难&#xff0c;本…

AFG1062任意波形/函数发生器 产品资料

AFG1000 任意波形/函数发生器&#xff0c;提供 25MHz 或 60MHz 带宽&#xff0c;2 个输出通道&#xff0c;在整个带宽内 1mVpp 到 10Vpp 输出振幅&#xff0c;泰克 AFG1000 任意波形/函数发生器可以生成各种实验室测试所需波形。 *重要的是&#xff0c;它在泰克任意函数发生器系…

推荐几款2023年还在用的IDE工具

近期有不少刚学编程的小伙伴来问我&#xff0c;市面上那么多IDE工具&#xff0c;该怎么选&#xff1f;今天在这里跟大家分享几款个人比较钟爱的IDE工具&#xff0c;供大家参考。 Visual Studio 优点&#xff1a;支持多种语言&#xff0c;包括C#, C, Visual Basic等&#xff0c…

Spring ( 二 ) 介绍

2.Spring Spring框架是一个用于Java开发的开源应用程序框架&#xff0c;提供了一系列的工具和解决方案&#xff0c;帮助开发者快速构建高质量、可维护的企业级应用。Spring框架的主要特点包括&#xff1a;模块化、轻量级、可测试性、松耦合、面向切面编程&#xff08;AOP&…

谷歌正在向所有账户推出密码终止技术

谷歌宣布让其个人帐户持有人使用称为“密码”的密码替代登录的一项重大努力。 该功能面向公司的数十亿帐户推出&#xff0c;用户将能够主动寻找并启用它。谷歌表示&#xff0c;它计划在未来几个月推广密码&#xff0c;并开始推动账户持有人将他们传统的用户名和密码登录转换为…

Flink dataStream,如何开窗,如何进行窗口内计算

目录 开窗方式 windowAll() window() 窗口类型 基于时间 基于数量 开窗后的处理函数 全量聚合函数&#xff08;也叫窗口函数&#xff09; 增量聚合函数 增量聚合函数携带一个全量聚合函数 开窗方式 windowAll() 对于没有keyBy的数据流 window() 对于KeyBy后的数据…

第13章 CacheService角色实体的CURD操作示例

1 Services.Customers.CustomerServiceDefaults using Core.Caching; using Core.Domain.Customers; namespace Services.Customers { /// <summary> /// 【用户服务默认--类】 /// <remarks> /// 摘要&#xff1a; /// 该类中的属性成员实例设定一些常量值&…