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 ...
随机推荐
- git push origin与git push -u origin master的区别
$ git push origin 上面命令表示,将当前分支推送到origin主机的对应分支. 如果当前分支只有一个追踪分支,那么主机名都可以省略. $ git push 如果当前分支与多个主机存在追 ...
- JavaScript类型化数组(二进制数组)
0.前言 对于前端程序员来说,平时很少和二进制数据打交道,所以基本上用不到ArrayBuffer,大家对它很陌生,但是在使用WebGL的时候,ArrayBuffer无处不在.浏览器通过WebGL和显卡 ...
- java 线程方法 ---- join()
class MyThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++){ S ...
- LEDAPS1.3.0版本移植到windows平台----HuPm参数初始化模块
这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. LEDAPS的调用顺序是:HuPm--&g ...
- SQL学习笔记---常用命令
常用命令 变量 1.声明 declare @变量名 类型,… 2.赋值 1.同时赋值多个变量(可以结合查询) select @变量名=表达式1,表达式2 2.单个赋值(推荐) set @变量名=表达式 ...
- lnmp环境里安装mssql及mssql的php扩展
小活中用到mssql,于是在自己lnmp环境中安装各mssql数据库 步骤如下: 源码编译安装 (1)下载freetds-stable-0.91源码:http://download.csdn.net/ ...
- equals方法相关总结
先说一下Object类吧: 这是一个号称为祖宗类的东西,是所有类的父类,也是唯一一个没有父类的类. 接口不继承object类 并且Object类存在于java的lang包中,我们都知道存在于lang包 ...
- 文本分类实战(二)—— textCNN 模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- day15-面向对象基础(二)
今天整理类的组合以及类的三大特性 1.类的组合 2.类的继承 3.类的封装 4.类的多态 开始今日份整理 1.类的组合 类与类之间,并不是独立的,很多的时候在正常使用的时候都是类与类之间互相调用,所以 ...
- 001_python多进程实例
一.工作中需要执行zk数据对比,需要按照机器进行并发,举例以下的例子 # coding:utf8 # !/usr/bin/python import time from multiprocessing ...