题解 CF1579G Minimal Coverage
CF1579G Minimal Coverage
dp好题! link to the problem
解法
首先需要观察到:如果最长线段的长度为\(maxL\),那么答案不可能超过\(2maxL\) 。
证明的话,可以用构选法来说明:当处于当前线段的尾处于区间\([0,maxL]\)时,下一个线段向右延伸;反之,当当前线段的尾处于区间\([maxL+1,2maxL]\)的话,那么下一个线段就向左延伸。由于\(maxL\)就是所有线段长度的最大值,因此不会有线段横跨\([0,maxL]\)或\([maxL+1,2maxL]\)
设 \(dp_{i,j}\)表示:第\(i\)个线段的结尾与整个覆盖区间左端点的距离为\(j\)时,该结尾与覆盖区间右端点的最小距离 \稍微有点绕

由于观察出来的结论,\(j\)只需要讨论\([0,2maxL]\)即可。
若第\(i\)个线段向左移动:\(dp_{i,max(0,j-a_i)\leftarrow dp_{i-1,j}+a_i}\)
若第\(i\)个线段向右移动:\(dp_{i,j+a_i}\leftarrow max(dp_{i-1,j}-a_i,0)\)
最后在统计答案时,答案就是\(\min_{i=0}^{2maxL}{i+dp_{n,i}}\)
代码
#include <bits/stdc++.h>
using namespace std;
#define lor(a,b,c) for(register int a=b;a<=c;++a)
#define ror(a,b,c) for(register int a=c;a>=b;--a)
const int N=1e4+5,M=2005,INF=0x3f3f3f3f;
int n,a[N],dp[N][M],maxlen,ans;
inline void updata(int &a,int b) {a=min(a,b);}
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int qwq; for(scanf("%d",&qwq);qwq;qwq--){
scanf("%d",&n); lor(i,1,n) scanf("%d",a+i);
maxlen=0; lor(i,1,n) maxlen=max(maxlen,a[i]);
lor(i,0,n) lor(j,0,maxlen*2) dp[i][j]=INF; dp[0][0]=0;
lor(i,1,n){
lor(L,0,maxlen*2) if(dp[i-1][L]^INF){
updata(dp[i][max(0,L-a[i])],dp[i-1][L]+a[i]);
}
lor(L,0,maxlen*2-a[i]) if(dp[i-1][L]^INF){
updata(dp[i][L+a[i]],max(dp[i-1][L]-a[i],0));
}
}
ans=INF; lor(i,0,maxlen) updata(ans,i+dp[n][i]);
printf("%d\n",ans);
}
return 0;
}
题解 CF1579G Minimal Coverage的更多相关文章
- 贪心 URAL 1303 Minimal Coverage
题目传送门 /* 题意:最少需要多少条线段能覆盖[0, m]的长度 贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优 接着就是从p=0开始,以p点为标志,选取 (node[i].l < ...
- 【区间覆盖问题】uva 10020 - Minimal coverage
可以说是区间覆盖问题的例题... Note: 区间包含+排序扫描: 要求覆盖区间[s, t]; 1.把各区间按照Left从小到大排序,如果区间1的起点大于s,则无解(因为其他区间的左起点更大):否则选 ...
- UVA 10020 Minimal coverage(贪心 + 区间覆盖问题)
Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li, ...
- uva 10020 Minimal coverage 【贪心】+【区间全然覆盖】
Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li,Ri ...
- UVA-10020 Minimal coverage(贪心)
题目大意:在x轴上,给一些区间,求出能把[0,m]完全覆盖的最少区间个数及该情形下的各个区间. 题目分析:简单的区间覆盖问题.可以按这样一种策略进行下去:在所有区间起点.长度有序的前提下,对于当前起点 ...
- ural 1303 Minimal Coverage【贪心】
链接: http://acm.timus.ru/problem.aspx?space=1&num=1303 http://acm.hust.edu.cn/vjudge/contest/view ...
- uva.10020 Minimal coverage(贪心)
10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...
- UVa 10020 - Minimal coverage(区间覆盖并贪心)
Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the min ...
- URAL 1303. Minimal Coverage(DP)
题目链接 又是输出路径...这题完全受上题影响,感觉两个题差不多..用了基本上一样的算法写了,这题比较纠结,就是卡内存啊...5000*5000的数组开不了..然后没办法,水了好几次MLE,看了一下虎 ...
- UVa 10020 (最小区间覆盖) Minimal coverage
题意: 数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖一条指定线段[0, m] 算法: [start, end]为已经覆盖到的区间 这是一道贪心 把各个区间先按照左端点从小到大排序,更新st ...
随机推荐
- NLP之基于词嵌入(WordVec)的嵌入矩阵生成并可视化
词嵌入 @ 目录 词嵌入 1.理论 1.1 为什么使用词嵌入? 1.2 词嵌入的类比推理 1.3 学习词嵌入 1.4 Word2Vec & Skip-Gram(跳字模型) 1.5 分级& ...
- Tauri-Vue3桌面端聊天室|tauri+vite3仿微信|tauri聊天程序EXE
基于tauri+vue3.js+vite3跨桌面端仿微信聊天实例TauriVue3Chat. tauri-chat 运用最新tauri+vue3+vite3+element-plus+v3layer等 ...
- 【神经网络】softmax回归
前言 softmax回归为一种分类模型. 基本原理 由于softmax回归也是一种线性叠加算法,且需要输出离散值. 很自然地想到,可以取值最大的输出为置信输出.更进一步想到,如果有三个人A.B.C分别 ...
- mybatis-获取参数值的方式
MyBatis获取参数值的两种方式(重点) MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串 ...
- GY91(MPU9250 + BMP280)惯性传感器开发指南
目录 参考资料 I2C 设备ID 关键数据读取 MPU6500:读取加速度数据&换算单位 BMP280: 读取温度和气压信息 & 单位换算 推荐库 参考资料 参考资料说明: 用户手册时 ...
- python 类相关 下划线相关 __init__
类 1.静态方法 class C(object): @staticmethod def f(): print('runoob'); C.f(); # 静态方法无需实例化 cobj = C() cobj ...
- spring运行报500 bean不存在
spring运行报500 bean不存在 bean不存在 步骤: 查看bean是否注入成功 junit单元测试 问题,不一定在我们底层,是spring出现了问题 SpringMVC整合 ...
- K8s如何启用cgroup2支持?
什么是 cgroup ️Reference: control groups(控制组),通常被称为cgroup,是Linux内核的一项功能.它允许将进程组织成分层的组,然后限制和监控各种资源的使用. 内 ...
- 线性时间选择(含平均情况O(n)和最坏情况O(n)算法)
前言 本篇文章我将介绍 期望为线性时间 的选择算法和 最坏情况为线性时间 的选择算法,即分别为 平均情况下时间复杂度为O(n) 和 最坏情况下时间复杂度为O(n) 的线性时间选择.以下包含了我自己的全 ...
- xml中出现< >&等特殊字符如何存储
特殊字符用下面对应得符号代替. < <= > >= & ' " < <= > >= & ' "