当前位置: 首页 > article >正文

洛谷P1484.种树

洛谷P1484.种树

题目解析及思路

题目要求在一条n个坑的路上,对于已知每个坑种树的收益,并且相邻两个坑不能同时种树的情况下,求最大收益

思考一个小范围的例子(不考虑数组全负数):

  • 当m = 1时,答案一定为数组中的最大数,假设为a[i]
  • 当m = 2时,答案有两种情况:1.仍取a[i],且再取一个其他不相邻的元素
    2.不取a[i],改为取a[i-1]和a[i+1](同取或同不取)

因此可以用一个堆将所有数据加入,如果k=1时最优解为a[i],那么我们便可以把a[i-1]和a[i+1]进行合并

同时将a[i]改成a[i-1]+a[i+1]-a[i],继续找最大的,直到最大值<=0或取完k个

**反悔贪心:**因为a[i-1]+a[i+1] > a[i]时,我们要取a[i-1]和a[i+1]而不是a[i],因此在改为a[i-1]+a[i+1]-a[i]时,如果再取到a[i-1]+a[i+1]-a[i],a[i-1]+a[i+1]-a[i] + a[i] = a[i-1]+a[i+1] 可以实现找更优情况

参考题解

代码

#include<bits/stdc++.h>

using namespace std;
#define PII pair<int, int>
typedef long long LL;
const int N = 300010;

bool st[N];
//lr分别存左右两边的下标,更新方式参考链表
int l[N],r[N],a[N];
//优先队列存对组,记录下标
priority_queue<PII> q;
LL n,m,res;

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        //优先队列存对组,记录下标
        scanf("%d", &a[i]);
        q.push(make_pair(a[i],i));
        //记录左右下标
        l[i] = i-1,r[i] = i+1;
    }
    //哨兵
    r[0] = 1,l[n+1] = n;
    while(m --)
    {
        //左右两边的元素被去掉了不遍历
        while(st[q.top().second])
            q.pop();
        PII tmp = q.top();
        q.pop();
        if(tmp.first <= 0) break;
        res += tmp.first;
        //取当前下标
        int pos = tmp.second;
        //把反悔值改进来
        a[pos] = a[l[pos]] + a[r[pos]] - a[pos];
        tmp.first = a[pos];
        //把两边去掉,标记成true
        st[l[pos]] = st[r[pos]] = 1;
        //更新左右"链表"
        l[pos] = l[l[pos]], r[l[pos]] = pos;
        r[pos] = r[r[pos]], l[r[pos]] = pos;
        q.push(tmp);
    }
    cout<<res<<endl;
}

http://www.kler.cn/a/350269.html

相关文章:

  • 如何使用CRM数据分析优化销售和客户关系?
  • apisix的authz-casbin
  • 《keras 3 内卷神经网络》
  • LLMs(大型语言模型)的多智能体:Auto-GPT
  • LeetCode hot 力扣热题100 排序链表
  • Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽
  • 【Linux】基本认知全套入门
  • docker启动的rabbitmq如何启动其SSL功能
  • 嵌入式中数据库sqlit3基本使用方法与现象
  • 十、结构型(外观模式)
  • Gin框架操作指南02:JSON渲染
  • 利用 Llama 3.1模型 + Dify开源LLM应用开发平台,在你的Windows环境中搭建一套AI工作流
  • 理解前端开发和小程序开发中的 build 和 dev 模式
  • 迪杰斯特拉算法的理解
  • Content-Type 详解
  • 打破医院内外网通讯壁垒的关键-消息摆渡
  • mysql用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)
  • MySQL 通过 Next-Key Locking 技术(行锁+间隙锁)避免幻读问题
  • Java中的Iterator接口,以及HashSet和TreeSet
  • Pytest中fixture的scope详解
  • iMeta: 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构
  • MySQL(python开发)——(3)表数据的基本操作,增删改查
  • C语言之练习题
  • Jenkins---01
  • 【黑苹果】记录MacOS升级Sonoma的过程
  • Android 应用中 MQTT 消息处理:选择适合的后台处理方案