POJ1821 Fence 题解报告
1 题目描述
A team of $k (1 <= K <= 100) $workers should paint a fence which contains \(N (1 <= N <= 16 000)\) planks numbered from \(1\) to \(N\) from left to right. Each worker \(i (1 <= i <= K)\) should sit in front of the plank \(S_i\) and he may paint only a compact interval (this means that the planks from the interval should be consecutive). This interval should contain the Si plank. Also a worker should not paint more than Li planks and for each painted plank he should receive \(P_i (1 <= P_i <= 10 000)\). A plank should be painted by no more than one worker. All the numbers Si should be distinct.
Being the team's leader you want to determine for each worker the interval that he should paint, knowing that the total income should be maximal. The total income represents the sum of the workers personal income.
Write a program that determines the total maximal income obtained by the K workers.
有 \(N\) 块木板从左至右排成一行,有 \(K\) 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。第 \(i\) 个工匠要么不粉刷,要么粉刷包含木板 \(i\) 的,长度不超过\(L_i\)的连续一段木板,每粉刷一块木板可以得到$P_i $的报酬。
求如何安排能使工匠们获得的总报酬最多。
输入
The input contains:
Input
N K
L1 P1 S1
L2 P2 S2
...
LK PK SK
Semnification
N -the number of the planks; K ? the number of the workers
Li -the maximal number of planks that can be painted by worker i
Pi -the sum received by worker i for a painted plank
Si -the plank in front of which sits the worker i
输出
The output contains a single integer, the total maximal income.
样例
样例输入1
8 4
3 2 2
3 2 3
3 3 5
1 1 7
样例输出1
17
提示
Explanation of the sample:
the worker 1 paints the interval [1, 2];
the worker 2 paints the interval [3, 4];
the worker 3 paints the interval [5, 7];
the worker 4 does not paint any plank
2 思路
2.1 暴力无优化
先将所有工匠按照Si从小到大排序
• 状态:f[i][j],前 i 个工匠粉刷前 j 块木板(允许为空)的最大报酬。
• 状态转移方程:
第\(i\)个工匠什么都不刷:\(f[i][j]=f[i-1][j]\)
第\(j\)块木板可以空着不刷:\(f[i][j]=f[i][j-1]\)
考虑第$ i $个工匠粉刷第 \(k+1~j\)块,
[][] ={[ − 1][] + ∗ ( − )},其中−≤≤−1, ≥
枚举\(i\),\(j\),\(k\),时间复杂度为\(O(n^2k)\)
因为我们可以看到数据并没有那么小:\(1 <= K <= 100\), \(1 <= N <= 16 000\)
显然就不行
以呢,我们考虑用优先队列优化
2.2 优先队列优化dp
优化:[][] ={[ − 1][] + ∗ ( − )},其中 ≥ ,−≤≤−1
• 将最外层循环i看作定值,考虑内层循环 j 和决策 k ,转换得到:
• [][] = ∗ +{[ − 1][] − ∗ )},其中−≤≤−1, ≥
维护一个决策点k单调递增,数值 \(f[i-1][k]-Pi×k\)单调递减的队列,
只有这个队列中的决策才有可能成为某一刻的最优决策
• 单调队列支持:
当 j 变大时,检查队头,将小于j-Li的出队。
查询最优决策时,队头为所求最大值
新决策入队时,检查队尾\(f[i-1][k]-Pi×k\)的单调性,无用决策出队,新
决策入队
2 具体实现
- 对于每一个外层循环i,
当内层循环开始时(\(j=S_i\)),建立一个空的单调队列,
将区间 \([max(j-Li,0),Si-1]\)的决策加入到单调队列中,执行3
- 对于每一个\(j=Si~N\),
先检查队头是否合法(1),再取队头为最优策略(操作2)进行状态转移,再进行入队(3)
总时间复杂度为O(NK)
code
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+2,K=1e2+2;
struct node{
int l,s,p;
}a[K];
bool cmp(node x,node y){
return x.s<y.s;
}
int f[K][N],q[N],n,k;
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=k;i++) {
scanf("%d%d%d",&a[i].l,&a[i].p,&a[i].s);
}
sort(a+1,a+k+1,cmp);
memset(f,0,sizeof(f));
for(int i=1;i<=k;i++){
int hd=0,tl=0;
q[tl++]=max(0,a[i].s-a[i].l);
for(int j=1;j<=n;j++){
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(j>=a[i].s+a[i].l) continue;
while(hd<tl&&q[hd]+a[i].l<j) hd++;
if(j>=a[i].s) f[i][j]=max(f[i][j],f[i-1][q[hd]]+a[i].p*(j-q[hd]));
else{
int x=f[i-1][j]-j*a[i].p;
while(hd<tl&&f[i-1][q[tl-1]]-q[tl-1]*a[i].p<x) tl--;
q[tl++]=j;
}
}
}
printf("%d\n",f[k][n]);
}
return 0;
}
完结撒花❀
·★,°:.☆( ̄▽ ̄)/$:.°★* 。
POJ1821 Fence 题解报告的更多相关文章
- 2015浙江财经大学ACM有奖周赛(一) 题解报告
2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...
- cojs 强连通图计数1-2 题解报告
OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...
- cojs 二分图计数问题1-3 题解报告
OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...
- 题解报告:hdu 1398 Square Coins(母函数或dp)
Problem Description People in Silverland use square coins. Not only they have square shapes but also ...
- 题解报告:hdu 2069 Coin Change(暴力orDP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...
- 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)
Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...
- CF Educational Round 78 (Div2)题解报告A~E
CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students 依题意模拟即可 #include<bits/stdc++.h> us ...
- [POJ1821]Fence(单调队列优化dp)
[poj1821]Fence 有 N 块木板从左至右排成一行,有 M 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次.第 i 个工匠要么不粉刷,要么粉刷包含木板 Si 的,长度不超过Li 的连续一段 ...
- CF1169(div2)题解报告
CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...
随机推荐
- 面试官:Zookeeper集群怎么搭建?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java拧螺丝选手,不必 ...
- 机器学习系列:LightGBM 可视化调参
大家好,在100天搞定机器学习|Day63 彻底掌握 LightGBM一文中,我介绍了LightGBM 的模型原理和一个极简实例.最近我发现Huggingface与Streamlit好像更配,所以就开 ...
- HTTP长连接和短连接及应用情景
HTTP短连接 HTTP/1.0中默认使用短连接, 客户端和服务器进行一次HTTP操作, 就需要建立一次连接, 任务结束连接也关闭. 当客户端浏览器访问的web网页中包含其他的web资源时, 每遇到一 ...
- MySql各版本
Mysql 各个版本区别: 1.MySQL Community Server 社区版本,开源免费,但不提供官方技术支持. 2.MySQL Enterprise Edition 企业版本,需付费,可以试 ...
- GEOS 使用记录
GEOS 使用记录 官网 https://trac.osgeo.org/geos/ https://libgeos.org/ 下载地址 https://libgeos.org/usage/downlo ...
- java并发问题总结
1.java中产生并发问题的主要原因有哪三个? 原子性.可见性和有序性 2.什么是java内存模型? java虚拟机规范中用来屏蔽掉各种硬件和操作系统内存访问差异,java内存模型的主要目标是定义程序 ...
- Java学习day32
生产与消费者问题:假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者从仓库中取走产品:如果仓库中没有产品,生产者就将产品放入仓库,否则就停止生产等待:如果仓库中有产品,消费者就取走,否 ...
- 2021蓝桥杯省赛B组(C/C++)E.路径【最短路DP】
2021蓝桥杯省赛B组题目(C/C++)E.路径 最短路径, 因为变化情况比较多, 所以开始想的是深搜, 但是太慢了, 跑不出来, 后来就想着优化一下, 有的地方到另一个地方可能会考虑很多遍, 于是考 ...
- Java 8的18个常用日期处理
Java 8的18个常用日期处理 一.简介 伴随 lambda表达式.streams 以及一系列小优化,Java 8 推出了全新的日期时间API. Java处理日期.日历和时间的不足之处:将 java ...
- openstack PCI透传(GPU)
描述 kolla-ansible部署openstack的GPU透传方法 一.gpu物理服务器配置 在gpu服务器上主启用IOMMU 确认内核⽀支持iommu $ cat /proc/cmdline | ...