luogu P1250 种树
我来总结一下最常用的两种办法
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 种树的更多相关文章
- P1250 种树
P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...
- Java实现洛谷P1250 种树 (暴力)
P1250 种树 输入输出样例 输入 9 4 1 4 2 4 6 2 8 9 2 3 5 2 输出 5 PS: 我种最少的树,意味着我的树要最多的被利用,意味着,我的树要尽可能的靠中间种, 也就是我把 ...
- P1250 种树(差分约束 / 贪心)
题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1-N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E,T ...
- Luogu 1484 种树
Luogu 1792 算是双倍经验. 我们考虑对于一个点,我们要么选它,要么选它周围的两个点. 所以我们考虑用一个堆来维护,每次从堆顶取出最大值之后我们把它的权值记为:它左边的权值加上它右边的权值减去 ...
- 洛谷P1250种树(贪心)
题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...
- P1250 种树 题解
题目描述 一条街道的一边有几座房子,因为环保原因居民想要在路边种些树,路边的居民被分割成 n 块,并被编号为 1…n.每块大小为一个单位尺寸并最多可种一棵树.每个居民想在门前种些树并指定了三个数b,e ...
- HDU 1384 Intervals &洛谷[P1250]种树
差分约束 差分约束的裸题,关键在于如何建图 我们可以把题目中给出的区间端点作为图上的点,此处应注意,由于区间中被标记的点的个数满足区间加法,这里与前缀和类似,对于区间[L..R]来说,我们加入一条从L ...
- 题解——洛谷P1250 种树(差分约束)
一道看一眼就知道差分约束的题目 但是最短路spfa的时候注意松弛条件是 if(dis[u]+w[i]<dis[v[i]]) dis[v[i]]=dis[u]+w[i]; 不能写成 if(dis[ ...
- Luogu P1484 种树
这道题目还是比较简单的 首先题目的意思就让我们很轻易地想到DP 我们设f[i][j]表示前i个坑中种j棵树的最大利益,则有: f[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i ...
随机推荐
- 一个可以自动生成css样式的插件happycss
一直在页面写css, 重复写着样式,发现布局中,特别是h5,大量的样式都是margin,padding,width,height, 而,当我们需要给一个标签写样式的时候,避免内联样式,我们又需要取cl ...
- SBC数据格式转换软件
北京博信施科技有限公司是一家专业从事数据格式转换.数据处理领域研发软件产品和解决方案实施的技术型公司.在当今信息时代,PDF文档格式是在Internet上进行电子文档发行和数字化信息传播的理想文档格式 ...
- geoserver发布瓦片,geoserver发布arcgis切片和geoserver发布金字塔切片
1 转https://www.jianshu.com/p/cf046ec1efd2,分享使用geoserver发布arcgis切片 2 转 http://www.it610.com/article/1 ...
- JHipster生成微服务架构的应用栈(一)- 准备工作
本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...
- git清空版本记录
在网上找的,记录下来自己使用 1.新增分支 git checkout --orphan latest_branch 2. 添加问题 git add -A 3. 提交 git commit -am &q ...
- Linux & Windows 环境下 Redis 安装与基本配置
索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...
- django源码分析 python manage.py runserver
django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...
- python实例七
https://www.cnblogs.com/evablogs/p/6791548.html 题目:将一个列表的数据复制到另一个列表中. 程序分析:打算利用for循环和append函数来复制到另一个 ...
- python 第二百零八天 ----算法相关
查找方法 : 顺序查找法 二分查找法 import time,random #时间计算 def cal_time(func): def wrapper(*args,**kwargs) ...
- 010 Editor v8.0.1(32 - bit) 算法逆向分析、注册机编写
010 Editor 的逆向分析整体算下来还是比较简单的,将程序拖入OD,通过字符串搜索定位到核心代码,经过分析,主要是如下图所示的两个关键函数,返回正确的值,才算是注册成功. 00409C9B 这个 ...