week4-C - TT 的神秘礼物

2023-10-25 10:50
文章标签 神秘 礼物 week4 tt

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

题目

TT 是一位重度爱猫人士,每日沉溺于 B 站上的猫咪频道。
有一天,TT 的好友 ZJM 决定交给 TT 一个难题,如果 TT 能够解决这个难题,ZJM 就会买一只可爱猫咪送给 TT。
任务内容是,给定一个 N 个数的数组 cat[i],并用这个数组生成一个新数组 ans[i]。新数组定义为对于任意的 i, j 且 i != j,均有 ans[] = abs(cat[i] - cat[j]),1 <= i < j <= N。试求出这个新数组的中位数,中位数即为排序之后 (len+1)/2 位置对应的数字,’/’ 为下取整。
TT 非常想得到那只可爱的猫咪,你能帮帮他吗?

Input

多组输入,每次输入一个 N,表示有 N 个数,之后输入一个长度为 N 的序列 cat, cat[i] <= 1e9 , 3 <= n <= 1e5

Output

输出新数组 ans 的中位数

Sample Input

4
1 3 2 4
3
1 10 2

Sample Output

1
8

思路

该题利用了二分答案P,枚举+二分计算P的名次的方法
复杂度为
在这里插入图片描述

怎样计算P的名次?

如果将X从小到大排列可以去绝对值。

那么计算𝑋𝑗−𝑋𝑖≤𝑃的二元组对数即可。

移项可得𝑋𝑗≤𝑋𝑖+𝑃, 𝑖<𝑗

枚举下标i然后计算满足条件的下标j的个数 也可以二分!

当然我们也可以换个角度来思考一下

想象存在这样一个数组,这个数组的前半部分全是1,后半部分全是0

这个数组可以有这样的含义

   如果a[i]=1,表明当p=i的时候,p的排名小于中位数如果a[i]=0,表明当p=i的时候,p的排名等于或大于中位数

在这里插入图片描述

R为最大可能的答案,在这个题中可以是数列B的最大值,也就是数列X中最大值和最小值的差

如果从这个角度来考虑的话,X就是我们要的答案

我们的任务变成了求这个数组中第一个0出现的位置


本题使用了二分答案和普通二分法,二分答案意味着找到答案的可行区间进行二分,可行区间内的点不一定都是满足条件的取值,但一定包括所有满足条件的取值。
step0 将所有数录入到数组ans中并按从小到大排序,这样后面的数一定会大于前面的数,作差时用后面的数减去前面的数即可得到绝对值

step1 用ans两头数相减作为max,0为min,在max和min之间进行二分,取p=(min+max)>>1,调用函数count(int p)计算ans中任意两值相减的绝对值中值<=p的个数,找到一个最小的p其count(int p)>=新数组长度的一半,该p即为所求中位数

step2 count(int p)中用i遍历ans数组,对i~n-1进行二分,找到最大的一个使ans[j]-ans[i]>=p的值,另sum+=(j-1),当i遍历完ans数组后,sum中存储的即为所求的ans中任意两值相减的绝对值中值<=p的个数。

错误

1、注意中位数的下标是新生成的数组的中位数,要先求出生成新数组的长度len,再用(len+1)/2得中位数的位置,不要错用成原数组的长度n,用(n+1)/2求。
2、其他两个错误注释在代码中。

代码

#include<iostream>
#include<algorithm>
using namespace std;
int ans[100000],n;
int count(int p)
{int sum=0;for(int i=0;i<n;i++)//可进行剪枝 {int l=i,r=n-1,j=-1;//注意这里r应该为n-1,若为n,可能二分时恰好为n,之后若再+1会越界 while(l<=r){int mid=(l+r)>>1;if(ans[mid]<=ans[i]+p){j=mid;l=mid+1;				}else r=mid-1;}if(j!=-1){sum+=(j-i);//注意j-i才是增加的绝对值个数,而非j+1 
//			cout<<"sum"<<sum<<endl;			}}return sum;
}
int main()
{while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++)scanf("%d",&ans[i]);sort(ans,ans+n);int max=ans[n-1]-ans[0],min=0,zw,len=n*(n-1)/2;
//		cout<<"len:"<<len<<endl;
//		cout<<max<<' '<<min<<endl;while(min<=max){int p=(min+max)>>1;
//			cout<<"p"<<p<<endl;
//			cout<<"count(p)"<<count(p)<<endl;if(count(p)>=(len+1)/2){zw=p;max=p-1;}else min=p+1;}printf("%d\n",zw);} return 0;
}

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



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

相关文章

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显

【DL--01】深度学习 揭开DL的神秘面纱

什么是深度学习 深度学习=深度神经网络+机器学习 人工智能 > 机器学习 > 表示学习 > 深度学习 神经元模型 输入信号、加权求和、加偏置、激活函数、输出 全连接层 输入信号、输入层、隐层(多个神经元)、输出层(多个输出,每个对应一个分类)、目标函数(交叉熵) 待求的参数:连接矩阵W、偏置b 训练方法:随机梯度下降,BP算法(后向传播) Python中深度学习实现:Ke

【机器学习】从零开始理解深度学习——揭开神经网络的神秘面纱

1. 引言 随着技术的飞速发展,人工智能(AI)已从学术研究的实验室走向现实应用的舞台,成为推动现代社会变革的核心动力之一。而在这一进程中,深度学习(Deep Learning)因其在大规模数据处理和复杂问题求解中的卓越表现,迅速崛起为人工智能的最前沿技术。深度学习的核心是神经网络,它模仿了生物神经系统的工作原理,通过层层叠加的结构化模型,逐步从数据中学习到有用的特征,从而完成分类、识别、生

【中秋礼物推荐】南卡Runner Pro 5:安全聆听,健康相伴

中秋节,月圆人团圆,是中华民族的传统佳节。在这个寓意着团聚与和谐的节日里,选择一份既实用又贴心的礼物,无疑是表达心意的最佳方式。而南卡Runner Pro 5骨传导耳机,以其独特的设计和卓越的性能,成为了中秋节送礼的不二之选。 南卡Runner Pro 5延续了品牌的简约风格,白色为主色调的盒子给人以清新之感,而侧拉式的开启方式则增加了开箱的乐趣,让人迫不及待想要一探究竟。耳机的设计符合

驾驭Python与MySQL的桥梁:pymysql的神秘面纱

文章目录 **驾驭Python与MySQL的桥梁:pymysql的神秘面纱**背景:为何选择pymysql?库的简介安装指南简单的库函数使用方法场景应用常见问题与解决方案总结 驾驭Python与MySQL的桥梁:pymysql的神秘面纱 背景:为何选择pymysql? 在数据驱动的现代世界中,数据库是存储和检索信息的核心。Python,以其简洁和强大的特性,成为了数据

内存管理篇-17解开页表的神秘面纱-下

1.页表初探遗留问题-页表的创建过程 使用MMU之前,页表要准备好,怎么准备的?如何把物理内存通过section映射构建页表页表的创建过程分析:__create_page_tables--创建临时页表,然后在开启MMU 页表的大小和用途页表在内存中的地址页表的创建过程内核在上电的时候,MMU还没有开启,此时运行在物理内存(前期都是一些汇编指令,这些指令和相对地址无关)。C语言的函数都是编译链接成

墨兰:花语寓意、神秘传说与独特魅力全解析

在繁花似锦的植物世界中,墨兰宛如一位优雅的隐士,静静地散发着独特的魅力。它那婀娜的身姿和淡雅的芬芳,仿佛在诉说着一个个古老而神秘的故事。当我们凝视着墨兰,不禁会被它那独特的气质所吸引,想要探寻它背后隐藏的花语深意以及那些流传千古的动人传说。 接下来,让我们一同走进墨兰的奇妙世界,去揭开它那神秘的面纱。 一、墨兰的花语与寓意 墨兰的花语丰富多样,象征着娴静、青春永驻、高雅淡泊等美好品质

抖音礼物打印机

抖音礼物打印机 需要小票打印机一台 代码实现功能: 1、读取抖音直播间弹幕 2、打印出礼物 3、设定规则 可以设置规则 大于多少音浪才打印 4、小尾巴,可以在每条信息的后面,加上 自定义话术 带货话术、今日运势、笑话、算命 、计算抖音等级 等等功能 ```javapackage com.company;import java.io.UnsupportedEncodingException;

Python中的身份运算符:揭开“is”与“is not”的神秘面纱

引言 身份运算符在Python中主要用于比较两个变量是否指向同一个对象(即内存地址是否相同),而非比较它们的值是否相等。这一特性使其成为处理对象引用关系时不可或缺的工具。例如,在处理大型数据结构、内存管理或调试过程中,身份运算符能帮助我们更准确地理解程序的状态变化。 基础语法介绍 is 运算符 定义:用来检查两个对象是否是同一对象,即它们是否存储在同一块内存空间中。用法:表达式 A is

OpenAI神秘“草莓”项目 计划最早今年秋季推出

据科技媒体The Information报道,OpenAI神秘“草莓”项目,计划最早今年秋季推出!上个月,OpenAI的内部团队被曝出正开发的“草莓”(Strawberry)项目,目的是增强OpenAI的模型的推理能力,处理复杂科学和数学问题的能力,让大模型不仅能生成查询答案,还能提前规划,以便自主、可靠地浏览互联网,进行OpenAI 定义的“深度研究”。 奥特曼曾强调,今后AI发展的关键将围