【前缀和】【two-pointer】【贪心】洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解
解法众多的一道毒瘤题?
题目描述
奶牛Bessie很喜欢闪亮亮的东西(Baling~Baling~),所以她喜欢在她的空余时间开采钻石!她现在已经收集了\(N\)颗不同大小的钻石,现在她想在谷仓的两个陈列架上摆放一些钻石。
Bessie想让这些陈列架上的钻石保持相似的大小,所以她不会把两个大小相差\(K\)以上的钻石同时放在一个陈列架上(如果两颗钻石的大小差值为\(K\),那么它们可以同时放在一个陈列架上)。现在给出\(K\),请你帮Bessie确定她最多一共可以放多少颗钻石在这两个陈列架上。
输入输出格式
输入格式:
第一行两个整数\(N,K\)。接下来\(N\)行,每行一个正整数\(a_i\),表示第\(i\)颗钻石的大小。
输出格式:
一行一个正整数,表示Bessie最多能放钻石的数量。输入输出样例
输入样例1:
7 3
10
5
1
12
9
5
14输出样例1:
5说明
对于\(100\%\)的数据,\(N\le50,000,a_i\le1,000,000,000,\ K\le1,000,000,000\)。
题解:
其实这个题可以用暴力线段树,也可以用DP单调栈。不过想到一种RMQ方法,也可以完成这道题。
题目要求每个陈列架中的元素最大-最小不超过定值\(k\),可以贪心地认为,它们处在一个区间里,下界是一个元素\(a_i\),上界是\(a_i+k\),这样避免了下界的浪费。同时因为没有顺序的要求,所以可以排序。
而我们要选择两个区间,就得使两个区间并中的元素个数最多。可以考虑用一个数组\(f[i]\)存下以\(a[i]\)开始,长度为\(k\)的区间有多少个数。
当两个区间不相交的时候,答案肯定就是两个数相加。当两个区间相交的时候呢?我们知道,相交肯定没有不相交优。如果两个区间相交了,可以把稍微靠后的区间向后平移一段,这样不会损失任何区间,反而可能会使答案变优。
所以枚举左边的区间,然后在左区间右端点以右找最大值。可以直接维护后缀最大值来转移,用\(mus[i]\)表示\(\max\limits_{j\in[i,n]}f[i]\),就可以在\(O(n)\)的时间内转移,并在总时间\(O(n\log n)\)内完成全部过程。
Code:
#include<cstdio>
#include<cstring>
#include<algorithm>
int mus[51000];//后缀最大值
int a[51000];
int b[51000];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
scanf("%d",&b[i]);
std::sort(b+1,b+1+n);
int t1=n;
for(int i=n;i;--i)
{
while(b[t1]>b[i]+k)
--t1;
a[i]=t1-i+1;//用two-pointer统计上界
mus[i]=std::max(mus[i+1],a[i]);
} int ans=0;
for(int i=1;i<=n;++i)
{
int ans1=0;
ans1=mus[i+a[i]];//转移最大值
ans=std::max(ans,a[i]+ans1);
}
printf("%d\n",ans);
return 0;
}
【前缀和】【two-pointer】【贪心】洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解的更多相关文章
- 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解
		P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ... 
- 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 解题报告
		P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ... 
- 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector
		题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ... 
- 洛谷P3143 [USACO16OPEN]钻石收藏家Diamond Collector
		题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ... 
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
		洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ... 
- BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解
		https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ... 
- 洛谷 P2949 [USACO09OPEN]工作调度Work Scheduling 题解
		P2949 [USACO09OPEN]工作调度Work Scheduling 题目描述 Farmer John has so very many jobs to do! In order to run ... 
- 洛谷P3387 【模板】缩点 题解
		背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ... 
- [NOI导刊2010提高&洛谷P1774]最接近神的人  题解(树状数组求逆序对)
		[NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ... 
随机推荐
- Junit问题01 利用 @Autowired 注入失效问题
			1 利用 @Autowired 注入失效问题 1.1 问题描述 在使用Junit作为测试框架的单元测试中,直接了用@Autowired记性依赖注入时总是注入失败 1.2 问题原因 在测试类中没有设定上 ... 
- SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证
			1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ... 
- sqLSERVER 计划缓存
			在这一期的性能调优培训里,我想详细谈下SQL Server里计划缓存及其副作用.在上一周你已经学到,每个提交给SQL Server的逻辑查询会编译成物理执行计划.那个执行计划然后会被缓存,即被称为计划 ... 
- 566. Reshape the Matrix矩阵重排
			[抄题]: In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a ... 
- mybatis spring 框架整合
			driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test user=LF password=LF <?xml versi ... 
- Deepin 2014.2正式版发布 - 自由·独特·前卫
			感谢 deepin 的投递 deepin致力于为全球用户提供美观易用.安全可靠的Linux系统. deepin系统使用基于HTML5技术开发的深度桌面环境,搭配深度音乐.深度影院.WPS和搜狗输入法等 ... 
- c语言实战 BJT时间转化位UTC时间
			题目是这样的: 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小时小 ... 
- python之连接oracle数据库
			环境: windows,python2.7 1.下载cx_Oracle 在windows下不要使用easy_install或者pip,因为这样安装不会同步环境,并报错: distutils.error ... 
- 6.Dump域内用户Hash姿势集合
			本文转自先知社区,原文链接:https://xz.aliyun.com/t/2527#toc-10 原文地址:https://pentestlab.blog/2018/07/04/dumping-do ... 
- Java List集合和Map集合的综合应用
			public static void main(String[] args) { //--------------------------------------------------------- ... 
