我来总结一下最常用的两种办法

1.贪心

2.差分约束

那么我们先来讲,贪心版《种树》

大家可能知道有一个题和这个类似,那个是钉钉子而这个是种树

我们可以借用钉钉子的思路来想,首先这个是让你求最小值,而且每个人都有自己划定的区间,并且他们还要求在这段区间内最少种T棵树。

那么我们既要满足最少种树数,而且要满足每个人的要求。好在的是,题目中说过区间和区间之间可能会有一段重叠,那么我们要抓住这个机会尽可能多的在每一段重复区间内多种树,所以就会产生一个连锁反应,就是上一个重复区间内种的树可能会满足下一个人的要求,那么这个人就可以略过去,以达到最少数的目的。

(以下是贪心代码,体会一下)

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n,m,ans=;
bool u[N]={};
struct Edge{
int x,y,z;
}a[N];
bool cmp(Edge a,Edge b)
{
return a.y<b.y;
}
int main()
{
cin>>n>>m;
for(int i=;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].z;
sort(a+,a+m+,cmp);
for(int i=;i<=m;i++)
{
int sum=;
for(int j=a[i].x;j<=a[i].y;j++)
if(u[j]) sum++;//统计已有的数量
if(sum>=a[i].z) continue;//满足就继续
for(int k=a[i].y;k>=a[i].x;k--)//不满足情况
{
if(!u[k])
{
u[k]=;
sum++;
ans++;//答案++
if(sum==a[i].z) break;//直到满足,退出
}
}
}
cout<<ans;//输出最后答案(即最少的树的数量)
return ;
}

接下来我们讲,差分约束版《种树》

我们都知道差分约束是用于最短路不等式问题的

这里我们利用差分约束解决最短路不等式的性质来看

我们想在区间内种最少的树,所以根据性质

我们可以列出两个差分约束公式

1.sum[x]-sum[y-1]>=c;(这里是指在区间[y,x]中至少种c棵树)

2.0<=sum[x]-sum[x-1]<=1;(这里是指一个单位长度内最多种1棵树)

根据公式,我们可以建边,但是建边是y+1->y=-1而不是y->y+1=1

建好边我们就可以跑一边SPFA啦,最少种树数也就出来了!

(差分约束代码,体会一下)

#include<bits/stdc++.h>
using namespace std;
const int N = ;
const int M = ;
int n,m;
int dis[N];
bool vis[N];
int head[N],num;
struct Edge{
int to,next,w;
}s[M];
void add(int u,int v,int w)//根据公式建边
{
s[++num].w=w;
s[num].next=head[u];
head[u]=num;
s[num].to=v;
}
void spfa(int x)//SPFA经典操(ban)作(zi)
{
queue<int> q;
q.push(x);
for(int i=;i<=n+;i++)
dis[i]=;
dis[x]=;vis[x]=;
while(!q.empty())
{
int g=q.front();
q.pop();
vis[g]=;
for(int i=head[g];i!=-;i=s[i].next)
{
int t=s[i].to;
if(dis[t]>dis[g]+s[i].w)
{
dis[t]=dis[g]+s[i].w;
if(!vis[t])
{
q.push(t);
vis[t]=;
}
}
}
}
}
int main()
{
int a,b,c,minn=;
memset(head,-,sizeof(head));
cin>>n>>m;
int y=n+;
for(int i=;i<=n;i++) add(y,i,);
for(int i=;i<=m;i++)
{
cin>>a>>b>>c;
add(b,a-,-c);
}
for(int i=;i<=n;i++)//建边操作
{
add(i-,i,);
add(i,i-,);
}
spfa(y);
for(int i=;i<=n;i++)//取最小值
minn=min(minn,dis[i]);
cout<<dis[n]-minn<<endl;
return ;
}

烟雨江南,无你何欢!

luogu P1250 种树的更多相关文章

  1. P1250 种树

    P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...

  2. Java实现洛谷P1250 种树 (暴力)

    P1250 种树 输入输出样例 输入 9 4 1 4 2 4 6 2 8 9 2 3 5 2 输出 5 PS: 我种最少的树,意味着我的树要最多的被利用,意味着,我的树要尽可能的靠中间种, 也就是我把 ...

  3. P1250 种树(差分约束 / 贪心)

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1-N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E,T ...

  4. Luogu 1484 种树

    Luogu 1792 算是双倍经验. 我们考虑对于一个点,我们要么选它,要么选它周围的两个点. 所以我们考虑用一个堆来维护,每次从堆顶取出最大值之后我们把它的权值记为:它左边的权值加上它右边的权值减去 ...

  5. 洛谷P1250种树(贪心)

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  6. P1250 种树 题解

    题目描述 一条街道的一边有几座房子,因为环保原因居民想要在路边种些树,路边的居民被分割成 n 块,并被编号为 1…n.每块大小为一个单位尺寸并最多可种一棵树.每个居民想在门前种些树并指定了三个数b,e ...

  7. HDU 1384 Intervals &洛谷[P1250]种树

    差分约束 差分约束的裸题,关键在于如何建图 我们可以把题目中给出的区间端点作为图上的点,此处应注意,由于区间中被标记的点的个数满足区间加法,这里与前缀和类似,对于区间[L..R]来说,我们加入一条从L ...

  8. 题解——洛谷P1250 种树(差分约束)

    一道看一眼就知道差分约束的题目 但是最短路spfa的时候注意松弛条件是 if(dis[u]+w[i]<dis[v[i]]) dis[v[i]]=dis[u]+w[i]; 不能写成 if(dis[ ...

  9. Luogu P1484 种树

    这道题目还是比较简单的 首先题目的意思就让我们很轻易地想到DP 我们设f[i][j]表示前i个坑中种j棵树的最大利益,则有: f[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i ...

随机推荐

  1. 广州.NET微软技术俱乐部微信群各位技术大牛的blog

    1. .net core和微服务领域的张善友张队长和马洪喜,证明了.net core和微服务已经在各方面都不比java差2. Xamarin的卢建晖,证明了.net在移动开发领域也是很牛的.3. wi ...

  2. 逛csdn看见的一个知识阶梯,感觉不错

    逛csdn看见的一个知识阶梯,感觉不错: 计算机组成原理 →  DOS命令 → 汇编语言 → C语言(不包括C++).代码书写规范 → 数据结构.编译原理.操作系统 → 计算机网络.数据库原理.正则表 ...

  3. iOS----------使用cocoapods遇到的问题

    -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...

  4. 容器化系列 - Zookeeper启动和配置 on Docker

    本文简要说明了如何在Docker容器中启动和配置Zookeeper. 1 准备工作 1.1 下载zookeeper镜像 $ docker pull zookeeper:3.4 1.2 单点模式 安装D ...

  5. 20181112-PostgreSQL数据库dmp文件导入(记录一次数据导入)

    20181112-PostgreSQL数据库dmp文件导入 标注:dmp文件导入,场景:多个schema导入 1. 环境准备: postgres集群master节点上,postgres用户执行以下操作 ...

  6. python模块(os,sys,hashlib,collections)

    列出目录下所有文件 os.listdir('dirname'):列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式返回. 创建文件夹: os.mkdir('文件夹')    创建文件夹 os ...

  7. 高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)

    1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块. 在用户空间中这不是问题,因为 ...

  8. Spring Boot 知识图谱

    最近有意重新学习下SpringBoot知识,特地总结了SpringBoot的知识点,对于想要学习的人来说,够用. SpringBoot学习路径 第一部分:了解 Spring Boot Spring B ...

  9. linux -- 添加、修改、删除路由

    在日常的使用中,或者在服务器中,有两个网卡配置两个地址,访问不同的网络段,这种情况是非常常见的现象,但是,我们需要额外的添加路由表来决定发送的数据包经过正确的网关和interface才能正确的进行通信 ...

  10. 3.15 总结,初始java