Dividing the Path POJ - 2373 dp
题意:你有无数个长度可变的区间d 满足 2a<=d<=2b且为偶数. 现在要你用这些区间填满一条长为L(L<1e6且保证是偶数)的长线段。
满足以下要求:
1.可变区间之间不能有交集,且不能超过长线段的左右边界
2.长线段上有若干短线段,给出他们的起始点与终点。你要保证对于任意一条短线段,你的某个区间可以完全包含它。
求最少需要多少个可变区间。
题解:用dp[x]表示填到x距离所需要最少的可变区间数。
分析发现x必定满足:
1.偶数
2.x不能在某条短线段上//若不然,则x在某条短线段上,则说明这条短线段未被包含,可以令dp[x]=INF;
3.x>=2A;//换言之,对于x<2A的x,是无法满足要求的,可以令dp[x]=INF
4.当x>2B时,存在 x-2B<=y<=x-2A 且满足上面三条的y,使得f[x]=f[y]+1;
由此对应的递推方程:

技巧:对于取min操作,我们用priorityqueue来优化(nlogn),用-1来从小到大排queue。对于奶牛出现的位置用线性算法处理(n)。对于 x-2B<=y<=x-2A 的处理,直接就不把他们push进queue里了,然后及时把不符合的pop掉。
坑:以后一些明显没错的东西就别xjb乱改了//其实是少写了个=号,wa了一页。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<queue>
#include<string.h>
using namespace std;
const int INF =1e9;
const int maxn = 1e3 + ;
const int maxl = 1e6 + ;
int dp[maxl];//长度为i时所需最少的喷头
int cow[maxl];//cow[i]==1代表有牛;用一个线性算法记录
int n, l, a, b;
priority_queue<pair<int,int>> qfx;
int main() {
cin >> n >> l;
cin >> a >> b;
a <<= , b <<= ;//覆盖直径
memset(cow, , sizeof(cow));
for (int i = ; i < n; i++) {
int s, e;
cin >> s >> e;
++cow[s + ];
--cow[e];
}
int incows = ;
for (int i = ; i <= l; i++) {
dp[i] = INF;
incows += cow[i];
cow[i] = (incows > );
}
for (int i = a; i <= b; i+=) if (!cow[i]) {
dp[i] = ;
if (i <= b + - a)qfx.push(make_pair(-,i));
}
for (int i = b + ; i <=l; i+=) {
if (!cow[i]) {
pair<int,int> now;
while (!qfx.empty()) {
now = qfx.top();
if (now.second < i - b) qfx.pop();
else break;
}
if (!qfx.empty()) dp[i] = -now.first + ;
}
if (dp[i -a+] != INF)qfx.push(make_pair(-dp[i - a + ],i - a + ));
}
if (dp[l] == INF) cout << -<<endl;
else cout << dp[l]<<endl;
return ;
}
Dividing the Path POJ - 2373 dp的更多相关文章
- Dividing the Path POJ - 2373(单调队列优化dp)
给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...
- poj2373 Dividing the Path (单调队列+dp)
题意:给一个长度为L的线段,把它分成一些份,其中每份的长度∈[2A,2B]且为偶数,而且不能在某一些区间内部切开,求最小要分成几份 设f[i]为在i处切一刀,前面的满足要求的最小份数,则f[L]为答案 ...
- POJ 2373 Dividing the Path(DP + 单调队列)
POJ 2373 Dividing the Path 描述 农夫约翰的牛发现,在他的田里沿着山脊生长的三叶草是特别好的.为了给三叶草浇水,农夫约翰在山脊上安装了喷水器. 为了使安装更容易,每个喷头必须 ...
- poj 2373 Dividing the Path
Dividing the Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2858 Accepted: 1064 ...
- [POJ 2373][BZOJ 1986] Dividing the Path
Link: POJ 2373 传送门 Solution: 一开始想错方向的一道简单$dp$,不应该啊…… 我一开始的想法是以$cows' ranges$的节点为状态来$dp$ 但明显一个灌溉的区间的两 ...
- poj2373 Dividing the Path
Dividing the Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5060 Accepted: 1782 ...
- Prime Path(POJ - 3126)【BFS+筛素数】
Prime Path(POJ - 3126) 题目链接 算法 BFS+筛素数打表 1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步.要求每次只能变1位,并且变1位后仍然 ...
- 【POJ】2373 Dividing the Path(单调队列优化dp)
题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...
- POJ 2373 Dividing the Path (单调队列优化DP)题解
思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...
随机推荐
- Aspose------导入Excel
代码: public List<T> ImportExcelToList<T>() { HttpContext context = HttpContext.Current; ) ...
- logstash结合rsyslog,收集系统日志
rsyslog是日志收集工具.如今非常多Linux都自带rsyslog,用其替换掉syslog.怎样安装rsyslog就不讲了.大概讲下原理.然后讲logstash的相关配置. rsyslog本身有一 ...
- Dubbo -- 系统学习 笔记 -- 成熟度
Dubbo -- 系统学习 笔记 -- 目录 成熟度 功能成熟度 策略成熟度 啦啦啦
- 树莓派(Raspberry Pi)USB无线网卡自动连接,二代B
Raspberry Pi 使用USB无线网卡的时候不会因为路由重启而掉线. #!/bin/bash while true ; do if ifconfig wlan0 | grep -q " ...
- iOS App Transprot Security
随着iOS 9和OS X EI Capitan 的发布,苹果官方引入了应用通讯安全模式的概念.简而言之,应用通讯安全模式强制性要求应用需要使用最佳的安全通讯协议,比如TLS 1.2版本和前向保密技术. ...
- using 释放内存的写法
using (FileStream fileStream = File.Open(fileName,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) ...
- Git的撤销与回滚
1,commit 之前的撤销 未添加至暂存区的撤销(add 之前) git status git checkout . 已添加至暂存区的撤销(add 之后,有或者没有commit操作都可以执行) gi ...
- 基本入门ISD9160开发指南
1 整体认识ISD9160 其详细介绍肯定看他的数据手册.抛开一切觑头功能,我们第一步就把它当做一个M0单片机来使用了.它有IO口,有串口,有SPI等,那就像用其它M0 一样的使用它呗.这个没啥难度了 ...
- .Net学习心得
把握自己就是,就是时时拥一颗清澈的心,拥有一片明朗的情怀,缓缓地,从2014的国度里跨进了2015,而我们也就随之告别了2个月的学习之旅,在这里我们拥有了如白色漂渺的梦,黯然升起,在彩色的云霄里飘 ...
- Linux设备驱动剖析之SPI(二)
957至962行,一个SPI控制器用一个master来描述.这里使用SPI核心的spi_alloc_master函数请求分配master.它在drivers/spi/spi.c文件中定义: struc ...