【题目描述:】

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);
}

最新文章

  1. [翻译]Apache Spark入门简介
  2. Codeforces Round #277.5 (Div. 2) ABCDF
  3. call指令的一个细节
  4. 猿题库 iOS 客户端架构设计
  5. the core or essence of a computer
  6. jquery animate 改变元素背景颜色
  7. 详解C++中指针(*)、取地址(&amp;)、解引用(*)与引用(&amp;)的区别 (完整代码)
  8. JavaScript绑定事件的方法[3种]
  9. gdbserver 安卓apk
  10. C语言功能 --C
  11. java代码中 路径符号的写法
  12. 做一个常规的banner图——负边距的使用、banner图的拼法
  13. 记录python学习过程中的一些小心得
  14. JavaScript实现接口的三种经典方式
  15. 杨力第一次jjave作业
  16. Nginx安装及配置详解【转】
  17. Fluent动网格【13】:网格光顺总结及实例
  18. MHA-Failover可能遇到的坑
  19. Intro to Python for Data Science Learning 8 - NumPy: Basic Statistics
  20. Windows Phone ProgressRing 控件

热门文章

  1. 为什么要用 C# 来作为您的首选编程语言
  2. Maven 项目管理从未如此通畅
  3. Effective C++ 避免数组多态
  4. sql SUM求和
  5. java网络编程(TCP详解)
  6. git push远程仓库时报错:fatal: remote origin already exists. (已解决)
  7. [清华集训]Rmq Problem / mex
  8. bzoj3167 [Heoi2013]Sao
  9. 2003 - Cann&#39;t connect to MySql server on - &#39;localhost&#39;(10061)
  10. thinkPHP3.2.2 控制器内跳转的三种方式