TT 的神秘礼物-二分答案

2023-10-25 10:50
文章标签 二分 答案 神秘 礼物 tt

本文主要是介绍TT 的神秘礼物-二分答案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

在这里插入图片描述

题目大意

题目给出了一个长度为N的数组cat,要求产生新数组ans,其中ans由所有abs(cat[i]-cat[j])组成,其中i≠j且1≤i<j≤N。要求求出ans排序后的中位数,即对应(len+1)/2的数字,’/'为下取整。

解题思路

本题在初次接触二分答案时会难以想到做法,但是此类题型十分重要,思路也要理解。首先为了确定某个数p是不是中位数,可以使用二分的思想求出p的名次,然后便可以确定中位数与p的大小关系,进行后续的二分求中位数。而对于每一个数p,由题目可得Xj - Xi = p (X即cat数组且已从小到大排序)。所以求p的名次就是求Xj - Xi ≤ p的二元组对数,亦即求Xj ≤ Xi + p,i < j的对数,此时枚举i计算满足条件的j数,也可以在数组X[i]到X[n-1]段进行二分求解。
此时对于某些二分边界条件的判断十分重要,即当l<r时持续二分,容易判断出现错误。在使用二分时,也可以使用c++算法自带的lower_bound( begin,end,num)和upper_bound( begin,end,num)函数。lower_bound用于计算数组begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end;upper_bound用于计算数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。本题中只要将计算得到的值减去(i+1)就是Xi对应Xj的个数了。

具体代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime> 
#include<iomanip>
#include<vector>
#include<queue>
#define ll long long
#define ld long double
using namespace std;int cat[100005];bool cmp(int x, int y)
{return x < y;
}int main()
{int n,num;while(~scanf("%d",&n)){for(int i = 0; i < n; i++){scanf("%d",&cat[i]);}sort(cat,cat+n,cmp);num = (n*(n-1)/2+1)/2;int l = 0;int r = cat[n-1] - cat[0];while(l < r){int mid = (l + r) >> 1;int sum = 0;for(int i = 0; i < n; i++){int k = cat[i] + mid;sum = sum + lower_bound(cat+i,cat+n,k+1) - (cat+i + 1);}if(sum >= num){r = mid;}else{l = mid + 1;}}printf("%d\n",l);}return 0;
}```

这篇关于TT 的神秘礼物-二分答案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/282057

相关文章

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

【网络安全的神秘世界】搭建dvwa靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 下载DVWA https://github.com/digininja/DVWA/blob/master/README.zh.md 安装DVWA 安装phpstudy https://editor.csdn.net/md/?articleId=1399043

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

华为面试题及答案——机器学习(一)

(1). 线性回归普通最小二乘法运用的经典基本假设有哪些? 线性回归中,普通最小二乘法(Ordinary Least Squares, OLS)是一种常用的估计方法。 线性关系假设: 假设自变量(X)与因变量(Y)之间存在线性关系。即,模型可以表示为 Y=β0+β1X1+β2X2+...+βnXn+ϵY = \beta_0 + \beta_1X_1 + \beta_2X_2 + ... +

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re

【网络安全的神秘世界】SQL注入漏洞

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 本章知识使用的靶场:DVWA 一、漏洞简介 SQL:结构化查询语言,是一种特殊的编程语言,用于数据库中的标准数据查询语言 SQL注入:简而言之就是,攻击者通过系统正常的输入数据的功能,输入恶意数据,而系统又未做任何校验或校验不严格,直接信任了用户输入,使得

转:40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

面试专区|【42道CSS高频题整理(附答案背诵版)】

1、简述CSS3选择器优先级及计算? CSS的选择器优先级是一个相对复杂的概念,它规定了在一组样式冲突时,哪些样式将被浏览器采纳。选择器优先级是通过一个四位的值来计算的,形式为:[内联样式, ID选择器, 类选择器/属性选择器/伪类, 元素选择器/伪元素]。这四个等级的优先级从左到右递减,左边的优先级最高,右边的优先级最低。 内联样式:直接在HTML元素中的"style"属性里定义的样式,优先

最新java编程50题及答案

【程序1】    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: