P3143 [USACO16OPEN]钻石收藏家Diamond Collector

题目描述

Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her spare time! She has collected NN diamonds (N \leq 50,000N≤50,000) of varying sizes, and she wants to arrange some of them in a pair of display cases in the barn.

Since Bessie wants the diamonds in each of the two cases to be relatively similar in size, she decides that she will not include two diamonds in the same case if their sizes differ by more than KK (two diamonds can be displayed together in the same case if their sizes differ by exactly KK). Given KK, please help Bessie determine the maximum number of diamonds she can display in both cases together.

奶牛Bessie很喜欢闪亮亮的东西(BalingBaling),所以她喜欢在她的空余时间开采钻石!她现在已经收集了N颗不同大小的钻石(N<=50,000),现在她想在谷仓的两个陈列架上摆放一些钻石。

Bessie想让这些陈列架上的钻石保持相似的大小,所以她不会把两个大小相差K以上的钻石同时放在一个陈列架上(如果两颗钻石的大小差值为K,那么它们可以同时放在一个陈列架上)。现在给出K,请你帮Bessie确定她最多一共可以放多少颗钻石在这两个陈列架上。

输入格式

The first line of the input file contains \(N\) and \(K\) \((0 \leq K \leq 1,000,000,000)\).

The next \(N\) lines each contain an integer giving the size of one of the

diamonds. All sizes will be positive and will not exceed \(1,000,000,000\).

输出格式

Output a single positive integer, telling the maximum number of diamonds that

Bessie can showcase in total in both the cases.

输入输出样例

输入 #1

7 3

10

5

1

12

9

5

14

输出 #1

5

【思路】

排序 + 双指针

【前缀思想】

很有意思的一道题目

这个需要找两组差不超过k的并且和最大的序列

因为需要差不超过k,

所以可以先将序列排一下序

然后就成为了有序的序列(很显然对吧)

这样就可以用双指针记录头和尾

然后只要头和尾的差小于等于k

就可以尝试一下这个区间能不能再扩大

所以可以很简单的就用双指针找出最长的差小于等于k的序列

【中心思想】

但是,这道题目有两个陈列架

所以找出一个最大的是不行的

而且找出次大的和最大的加起来也是不可行的

因为不保证最大和次大的区间不重叠

所以可以正序扫一遍然后找出

到每一个点之前最长的差小于等于k的序列

然后再倒序找一遍找出

到每一个点之后最长的差小于等于k的序列

【小细节】

这样,只需要再枚举一遍每一个点

然后比较前后加起来的和最大的就是了

不过,如果出现了前后最大的刚好重叠在枚举到的这个点

那么加起来的和就会重复一次

而且是不合法的

毕竟你不能把一个宝石放在两个陈列架上

所以就有了后面在比较时候的:

M = max(M,qian[i] + hou[i + 1]);

这样就不会出现一个点刚好是两个区间的交点的情况了

【完整代码】

#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std;
const int Max = 50005;
int a[Max];
int qian[Max];
int hou[Max];
int main()
{
int n,k;
cin >> n >> k;
for(register int i = 1;i <= n;++ i)
cin >> a[i];
sort(a + 1,a + 1 + n);
for(register int l = 1,r = 1;r <= n;++ r)
{
while(a[r] - a[l] > k && l <= r)l ++;
qian[r] = max(qian[r - 1],r - l + 1);
}
for(register int r = n,l = n;l >= 1;l --)
{
while(a[r] - a[l] > k && l <= r)r --;
hou[l] = max(hou[l] + 1,r - l + 1);
}
int M = 0;
for(register int i = 1;i < n;++ i)
M = max(M,qian[i] + hou[i + 1]);
cout << M << endl;
return 0;
}

洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解的更多相关文章

  1. 【前缀和】【two-pointer】【贪心】洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解

        解法众多的一道毒瘤题? 题目描述 奶牛Bessie很喜欢闪亮亮的东西(Baling~Baling~),所以她喜欢在她的空余时间开采钻石!她现在已经收集了\(N\)颗不同大小的钻石,现在她想在谷 ...

  2. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 解题报告

    P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...

  3. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector

    题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ...

  4. 洛谷P3143 [USACO16OPEN]钻石收藏家Diamond Collector

    题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ...

  5. [USACO16OPEN]钻石收藏家Diamond Collector

    由于相差不超过k才可以放在一起,要判断不超过k这个条件,显然我们需要排序 首先我们需要一个f数组,f[i]意义看代码开头注释, 假设我们可以选择的某一个区间是a[l]~a[r](已排序且最优(最长的意 ...

  6. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  7. 洛谷P3387 【模板】缩点 题解

    背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...

  8. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  9. [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)

    [洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...

随机推荐

  1. ORACLE数据库实现自增的两种方式

    Mysql数据库因为其有自动+1,故一般我们不需要花费太多时间,直接用关键字auto_increment即可,但是Oracle不行,它没有自动增长机制.顾我们需要自己去实现.一般有两种方式,但是这两种 ...

  2. 阿里云ECS云服务器Linux Tomcat启动慢 访问网页转圈

    状况: 今天购买了一台阿里云云服务器,按照正常的方式安装JDK,mysql,以及Tomcat 这里的版本信息有 系统 :Centos 7 tomcat: apache-tomcat-8.5.45.ta ...

  3. Kubernetes1.11.1 使用Nvidia显卡配置方法

    一.安装 1.1.kubernetes硬件支持问题说明 Kubernetes目前主要在很小程度上支持CPU和内存的发现.Kubelet本身处理的设备非常少.Kubernetes对于硬件都使用都依赖于硬 ...

  4. Jekyll自动检测代码更新

    Jekyll自动检测代码更新 jekyll是一个静态博客生成软件, 我们把代码放在一个仓库里, 只要远程代码更新, 我们就从把它拉到自己的服务器, 然后重新启动jekyll. cd /root/blo ...

  5. JDBC第一个案例

    1.概述 JDBC(Java DataBase Connectivity) 是 Java 提供的用于执行 SQL 语句一套 API,可以为多种关系型数据库提供统一访问,由一套用 Java 语言编写的类 ...

  6. iOS - 外加字体(只需三步-教你轻松实现)

    外加字体 1.首先info.plist中加入属性Fonts provided by application,在item 0 处填写导入的ttf文件名 eg: <key>UIAppFonts ...

  7. Math对象的一些方法

    ceil(n) 返回n向上取整的最近的整数floor(n) 返回n向下取整到最近的整数max(a,b,c...) 返回最大值min(a,b,c...) 返回最小值round(n) 返回n四舍五入的最近 ...

  8. 聊聊 ES6 中的箭头函数

    首先来两点: 当只有一个参数的时候,那么 () 可以省略 当只有一个 return 的时候,那么 {} 可以省略 当函数体内只有一条语句的时候,那么 {} 也可以省略 下面来几个简单的例子来对比 ES ...

  9. js两个变量互换值

    js两个变量交换值 这个问题看似很基础,但是有很多的实现方式,你知道的有多少呢,网上也有很多的方法,下面就来总结一下 中间变量(临时变量) 临时变量其实很好理解,通过一个中间变量进行交换值 var s ...

  10. Matlab title正确显示下划线

    前言 使用matlab中title语句,直接敲下划线无法正确显示. title('MSB_data'); 流程 使用如下语句即可:直接字符串转译 title('MSB_data','Interpret ...