【洛谷】【堆+贪心】P1484 种树
2024-10-19 05:32:32
【题目描述:】
cyrcyr今天在种树,他在一条直线上挖了n个坑。这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树。而且由于cyrcyr的树种不够,他至多会种k棵树。假设cyrcyr有某种神能力,能预知自己在某个坑种树的获利会是多少(可能为负),请你帮助他计算出他的最大获利。
【输入格式:】
第一行,两个正整数n,k。
第二行,n个正整数,第i个数表示在直线上从左往右数第i个坑种树的获利。
【输出格式:】
输出1个数,表示cyrcyr种树的最大获利。
输入样例#: - -
输出样例#:
输入输出样例
【算法分析:】
这时一道贪心的题目:
对于一个树坑i,有两种状态:种树或者不种树
当选择树坑i种树时,获利为a[i]
而也可以选择在(i - 1)和(i + 1)两个位置种树,所以将a[i]更新成a[i - 1] + a[i + 1] - a[i]
利用大根堆每次寻找最大值,并将更改后的值再次push进堆里
如果选择i后又选择了(i - 1)和(i + 1),更新时 - a[i]的操作就显得不可或缺了= =
利用堆优化后的算法复杂度为O(k log2 n)
【代码:】
//种树
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector> #define pii pair<int, int>
#define mkp make_pair
#define fi first
#define se second
using namespace std; const int MAXN = + ; priority_queue<pii> q; int n, k;
int a[MAXN], l[MAXN], r[MAXN];
bool tree[MAXN];
long long ans; int main() {
scanf("%d%d", &n, &k);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
q.push(mkp(a[i], i));
l[i] = i - , r[i] = i + ;
}
r[] = , l[n + ] = n;
while(k--) {
while(tree[q.top().se]) q.pop();
pii tmp = q.top();
q.pop();
if(tmp.fi <= ) break;
ans += tmp.fi;
int pos = tmp.se;
a[pos] = a[l[pos]] + a[r[pos]] - a[pos];
tmp.fi = a[pos];
tree[l[pos]] = tree[r[pos]] = ;
l[pos] = l[l[pos]], r[l[pos]] = pos;
r[pos] = r[r[pos]], l[r[pos]] = pos;
q.push(tmp);
}
printf("%lld\n", ans);
}
最新文章
- [翻译]Apache Spark入门简介
- Codeforces Round #277.5 (Div. 2) ABCDF
- call指令的一个细节
- 猿题库 iOS 客户端架构设计
- the core or essence of a computer
- jquery animate 改变元素背景颜色
- 详解C++中指针(*)、取地址(&;)、解引用(*)与引用(&;)的区别 (完整代码)
- JavaScript绑定事件的方法[3种]
- gdbserver 安卓apk
- C语言功能 --C
- java代码中 路径符号的写法
- 做一个常规的banner图——负边距的使用、banner图的拼法
- 记录python学习过程中的一些小心得
- JavaScript实现接口的三种经典方式
- 杨力第一次jjave作业
- Nginx安装及配置详解【转】
- Fluent动网格【13】:网格光顺总结及实例
- MHA-Failover可能遇到的坑
- Intro to Python for Data Science Learning 8 - NumPy: Basic Statistics
- Windows Phone ProgressRing 控件
热门文章
- 为什么要用 C# 来作为您的首选编程语言
- Maven 项目管理从未如此通畅
- Effective C++ 避免数组多态
- sql SUM求和
- java网络编程(TCP详解)
- git push远程仓库时报错:fatal: remote origin already exists. (已解决)
- [清华集训]Rmq Problem / mex
- bzoj3167 [Heoi2013]Sao
- 2003 - Cann&#39;t connect to MySql server on - &#39;localhost&#39;(10061)
- thinkPHP3.2.2 控制器内跳转的三种方式