**CodeForces CF1928B Equalize题解**

news/2024/11/20 20:38:53/文章来源:https://www.cnblogs.com/lgdxxs12138/p/18289263

ok兄弟们,今天本蒟蒻来做一篇小小的题解

Equalize

题面翻译

有一个给定的长度为 $n$ 的数列 $a$,现在加上一个排列 $b$,即 $c_i=a_i+b_i$。

现在求对于所有可能的 $b$,$c$ 中出现最多的数的出现次数的最大值。

translate by @UniGravity.

题目描述

Vasya has two hobbies — adding permutations $ ^{\dagger} $ to arrays and finding the most frequently occurring element. Recently, he found an array $ a $ and decided to find out the maximum number of elements equal to the same number in the array $ a $ that he can obtain after adding some permutation to the array $ a $ .

More formally, Vasya must choose exactly one permutation $ p_1, p_2, p_3, \ldots, p_n $ of length $ n $ , and then change the elements of the array $ a $ according to the rule $ a_i := a_i + p_i $ . After that, Vasya counts how many times each number occurs in the array $ a $ and takes the maximum of these values. You need to determine the maximum value he can obtain.

$ ^{\dagger} $ A permutation of length $ n $ is an array consisting of $ n $ distinct integers from $ 1 $ to $ n $ in arbitrary order. For example, $ [2,3,1,5,4] $ is a permutation, but $ [1,2,2] $ is not a permutation ( $ 2 $ appears twice in the array), and $ [1,3,4] $ is also not a permutation ( $ n=3 $ but there is $ 4 $ in the array).

输入格式

Each test consists of multiple test cases. The first line contains a single integer $ t $ ( $ 1 \leq t \leq 2 \cdot 10^4 $ ) — the number of test cases. Then follows the description of the test cases.

The first line of each test case contains a single integer $ n $ ( $ 1 \le n \le 2 \cdot 10^5 $ ) — the length of the array $ a $ .

The second line of each test case contains $ n $ integers $ a_1, a_2, \ldots, a_n $ ( $ 1 \le a_i \le 10^9 $ ) — the elements of the array $ a $ .

It is guaranteed that the sum of $ n $ over all test cases does not exceed $ 2 \cdot 10^5 $ .

输出格式

For each test case, output a single number — the maximum number of elements equal to the same number after the operation of adding a permutation.

样例 #1

样例输入 #1

7
2
1 2
4
7 1 4 1
3
103 102 104
5
1 101 1 100 1
5
1 10 100 1000 1
2
3 1
3
1000000000 999999997 999999999

样例输出 #1

2
2
3
2
1
1
2

提示

In the first test case, it is optimal to choose $ p = [2, 1] $ . Then after applying the operation, the array $ a $ will be $ [3, 3] $ , in which the number $ 3 $ occurs twice, so the answer is $ 2 $ .

In the second test case, one of the optimal options is $ p = [2, 3, 1, 4] $ . After applying the operation, the array $ a $ will be $ [9, 4, 5, 5] $ . Since the number $ 5 $ occurs twice, the answer is $ 2 $ .

本题需要我们做的就是,在题目给的A数组的基础上,对其添加一个序列。

(序列中每个数字只能添加一次)

本题的关键就是要理解如何添加序列以及序列的关键节点。

那么该如何添加序列呢?首先,请各位思考一下,1和1可能在添加该序列后出现相同的值吗?因为同一个值是只能使用一次的,所以不能,不合法。因此,我们需要对原数组进行降重处理。

此外,如果原数组为{1,2,3,4,5,6,7}恰好为公差为1的等差数列,那么获取相等最多的数组就是将序列1~7反向添加,也就是{8,8,8,8,8,8,8}。那么我们去掉部分并延展这个原数列{1,4,7,12,13,14,15,16,20}

极端情况下思考,为了使相等的元素尽量多,我们会让原数组最小的值最大化,最大的值最小化,即最小的值加上序列的最大值,最大的值加上序列的最小值。如果满足a(min)+n>=a(max)+1,那么在原数组区间内(min~max),是不是有多少值,我们都有相对应的序列进行匹配,又因为我们进行了降重操作,所以无需考虑重复,因此,我们需要进行排序操作

思路综上所述,以下是代码实现

include<bits/stdc++.h>

using namespace std;
int t, n;
vectora(n);
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
vectora(n);
for (int i = 0; i < n ; i++) {
scanf("%d ", &a[i]);
}
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
int m = a.size(), res = 0;
for (int l = 0, r = 0; r < m; r++) {
while (l <= r && a[r] + 1 - a[l] > n)l++;
if (l <= r && a[r] + 1 - a[l] <= n)res = max(res, r - l + 1);
}
printf("%d\n", res);
}
return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT学习遇到的问题 乱码

孔夫子上买了一本二手的《QT 5.9 C++开发指南》, 从网站上下载了书中的代码, 在运行样例6.1过程中, 发现弹出的对话框中字符为乱码, 经过搜索, 找到了如下解决方法: 在头文件中添加了一行代码: #pragmaexecution_character_set("UTF-8")

微信小程序自动识别收货地址

为提升用户体验,在用户新增收货地址时,加入自动识别收货地址功能。.wxml <view class="top"><input type="text" placeholder="复制收货信息(格式:姓名→电话→地址)" value="{{distinguish}}"bindinput="distinguis…

性价比很高的多域名SSL证书:Buypass

在当今数字化快速发展的时代,网络安全已成为公众和企业关注的焦点。为了保障网站数据的安全传输,许多网站都采用了SSL证书来加密用户与服务器之间的通信。申请Buypass六个月免费SSL证书步骤 1、输入域名,注意由于Buypass不支持泛域名,请不要勾选泛域名。 2、选择加密方式,…

01、基础介绍

Kubernetes介绍和各组件盘点 01、K8S总览 Kubernetes(K8s),用于自动部署、扩容、缩容和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。 Kubernetes源自Google 15年生产环境的运维经验,同时凝聚了社区最佳创意和实践。 简单…

RAG知识库之多表示索引

在朴素RAG中通常会对文档、文本进行分块后进行文档嵌入,对所有文件、文本都没有经过采用Chunk方法可能有时候效果不是和好,尽管有着各种分块策略有针对大文件的、针对小文件的策略,但都难免可能会造成上下文语义丢失。分块通常有两个非常重要的参数chunk_size、chunk_overla…

Halcon学习笔记(3):WPF 框架搭建,MaterialDesign+Prism

目录前言环境Nuget安装新建WPF 类库项目初始化PrismApp启动页初始化重写MainView 前言 其实我更喜欢CommunityToolkit.mvvm+HandyControl。但是因为找工作,你不能去抗拒新事物。这里就当体验一下完整的流程好了。 环境windows 11 .net core 8.0Nuget安装新建WPF 类库项目新建项…

Halcon 学习笔记(2):Halcon+WPF导入

目录前言.net core 8.0.net core 8.0新功能,打开文件夹和打开文件HSmartWindowControlWPFSystem.Drawing.Common重置拉伸关闭拖拽和缩放文件导出 前言 这里补充一下Halcon导入到WPF的要求 .net core 8.0 Halcon是支持.net core 8.0导入的 .net core 8.0新功能,打开文件夹和打…

数据血缘系列(1)—— 为什么需要数据血缘?

大家好,我是独孤风。在当今数据驱动的商业环境中,数据治理成为企业成功的关键因素之一。本文我们详细探讨下为什么需要数据血缘,并说明数据血缘如何帮助企业解决关键问题,特别是在不同行业中的实际应用。 本文为《数据血缘分析原理与实践 》一书读书笔记,部分观点参考自书…

camunda开源工作流快速入门(一):部署camunda流程平台

本教程将指导您使用 Camunda 7.19版本(支持JDK1.8的最新的Camunda 版本)进行建模和实施您的第一个工作流。在本指南中,您将快速体验Camunda的核心功能,包括:流程设计器、自动化流程、人工任务流程、表单设计器、DMN决策表(规则引擎)等。本教程将指导您使用 Camunda 7.19…

清理引导程序Kingdee.BOS.DeskClient.Shell.exe中不要的地址

如下图,删除配置文件DeskAppManager中对应的配置项即可。

一分钟内!利用AI做出指定角色、指定动作的影片!AI现可精准控制表情、动作,主角可以是你自己!

AI可以根据提供的起始和结束帧图片自动生成动画视频,包括指定角色、表情、动作,并且能够控制效果。AI可以根据提供的起始和结束帧图片自动生成动画视频,包括指定角色、表情、动作,并且能够控制效果。 AI能够捕捉图片的细节和物理逻辑,生成稳定背景的动态视频。 可以先通过…

使用Terminal.Gui构建功能强大的.NET控制台应用

前言 前段时间分享了一个库帮你轻松的创建漂亮的.NET控制台应用程序 - Spectre.Console的文章教程,然后就有小伙伴提问:.NET控制台应用需要应对强交互性的场景,有什么好的解决方案?,今天大姚给大家分享一款适用于.NET的跨平台终端 UI 工具包,帮助大家快速构建功能强大的.…