关闭

[BZOJ2151]种树(贪心+堆)

542人阅读 评论(0) 收藏 举报
分类:

题目描述

传送门

题解

n3的dp是很容易想到的,把最大值优化一下可以做到n2
首先考虑没有相邻的两个不能同时种的约束,可以发现就是一个简单的贪心。但是如果加上这个约束是贪心是不行的,反例也很简单。
可以借鉴网络流加反向弧的思想,就是跑不对是可以退流的。那么我们可以还像贪心一样搞,每一次找出最大的点,然后将这个点的左右两个点删去,将这个点的值改为它左右的点的和减去它原来的权值。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define N 200005
#define pii pair<int,int>

priority_queue <pii,vector<pii> > q;
int n,m,ans;
int a[N],L[N],R[N];
bool flag[N];

int main()
{
    scanf("%d%d",&n,&m);
    if (m>(n>>1))
    {
        puts("Error!");
        return 0;
    }
    for (int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        L[i]=i-1; R[i]=i+1;
        q.push(make_pair(a[i],i));
    }
    L[1]=n; R[n]=1;
    ans=0;
    while (m--)
    {
        int val=q.top().first,x=q.top().second; q.pop();
        while (flag[x]) val=q.top().first,x=q.top().second,q.pop();
        ans+=val;
        a[x]=a[L[x]]+a[R[x]]-a[x];
        flag[L[x]]=true; flag[R[x]]=true;
        L[x]=L[L[x]];
        R[x]=R[R[x]];
        R[L[x]]=x;
        L[R[x]]=x;
        q.push(make_pair(a[x],x));
    }
    printf("%d\n",ans);
}

总结

1、考虑负权!goudie…

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

spfa||贪心——洛谷P1250 种树

https://www.luogu.org/problem/show?pid=1250 贪心这个很简单吧; 就是按右端排序; 当前区间不满则在右端种树; 这样可以保证重复最多; spfa就很有意思了 其实题目化开来 查分约束系统,变量dis[k]是前k家种树的前缀和,满足三个条件: ...
  • largecub233
  • largecub233
  • 2017-06-02 08:21
  • 187

bzoj 2151 种树(贪心+堆)(经典)

思路: 看到题,第一反应就是搜索,学了一年,还太水。。看了大神的博客。如下: 分析: 首先考虑如果没有“相邻位置不能都种”这一限制会怎么样。这时就是一个裸的贪心——按照A[i]从大到小排序,然后取前M个。 那么加上限制以后会发生什么呢?
  • kaisa158
  • kaisa158
  • 2015-07-20 14:47
  • 1024

【bzoj2151】【种树】【堆+贪心】

DescriptionA城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i...
  • sunshinezff
  • sunshinezff
  • 2015-08-30 19:51
  • 1382

NOIP实用算法 4.贪心方法

4.贪心方法 a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法 a.工程计划模型 我们常常碰到这样的问题:完成一个工程需要若干个步骤,每个步骤都有若干种方法,图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法...
  • hellobinfeng
  • hellobinfeng
  • 2013-10-27 04:54
  • 1345

【BZOJ2151】种树,贪心+Splay乱搞

间接砍树胡乱种"树"毫无建树
  • xym_CSDN
  • xym_CSDN
  • 2016-08-29 20:55
  • 184

【Bzoj2151】种树

题意A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位...
  • Zhayan9QvQ
  • Zhayan9QvQ
  • 2017-04-01 10:55
  • 342

【bzoj2151】种树

DescriptionA城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i...
  • w_yqts
  • w_yqts
  • 2017-07-24 16:55
  • 85

贪心算法在找钱问题上的使用

背景:对于现实生活中的找零问题,假设有数目不限,面值为20,10,5,1的硬币。 求出找零方案,要求:使用数目最少的硬币。 对于此类问题,贪心算法采取的方式是找钱时,总是选取可供找钱的硬币的最大值。比如,需要找钱数为25时,找钱方式为20+5,而不是10+10+5。实现:#include<...
  • ljp1919
  • ljp1919
  • 2017-03-16 21:34
  • 948

codevs均分纸牌 贪心算法

题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。   移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 ...
  • glaugagefer
  • glaugagefer
  • 2015-04-21 00:50
  • 676

0-1背包问题、贪心算法、动态规划

0-1背包问题
  • songshiMVP1
  • songshiMVP1
  • 2016-08-29 18:32
  • 4083
    个人资料
    • 访问:598828次
    • 积分:17456
    • 等级:
    • 排名:第647名
    • 原创:1151篇
    • 转载:7篇
    • 译文:0篇
    • 评论:168条
    联系方式
    QQ:1209628538 加好友请备注省份和ID
    E-mail:fiona_2000@126.com
    最新评论