程序设计思维与实践 Week4 作业 C TT 的神秘礼物

2023-05-16

题目描述:

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 非常想得到那只可爱的猫咪,你能帮帮他吗?

题目简述:给定一个整数序列,对于任意一对数[xi xj],i!=j,计算其差的绝对值,使其差的绝对值构成新的数列,并找出新数列的中位数。

Input:

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

Output:

输出新数组 ans 的中位数

思路:

暴力做法:双重循环枚举数列,计算其对应的绝对值,生成新数列,然后排序后得出中位数,时间复杂度为O(n^2),太暴力!

考虑二分的做法,首先将cat数组排序(由小到大),那么中位数一定位于0到cat[n]之间,且是一个整数。所以就可以对中位数进行二分。二分时,对于当前的值,去进行判断,判断其是否为中位数。判断的原理是:在排好序的数列中catj-cati>=0(j>i)恒成立,则可去掉绝对值号,catj-cati<=P的数对个数,就是P在差序列中的排名,若排名恰好等于(n*(n-1)/2+1)/2,则P为中位数。用到了两次二分,即二分中位数P,然后通过二分的方法去判断P的排名。总的时间复杂度为O(logn*logn)

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,flag,a[100010];
int init()
{
	int f=1,p=0;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
	return f*p;
}
bool judge(int x)
{
	int tmp=0;
	for(int i=1;i<=n;i++)
	{
		int l=i+1,r=n,mid,j=0;
		while(l<=r)//找到最后一个使得a[j]<=a[i]+x的j 
		{
			mid=(l+r)/2;
			if(a[mid]<=a[i]+x) j=mid;
			if(a[mid]<=a[i]+x) l=mid+1;
			else r=mid-1;
		}
		if(j!=0)
		tmp+=j-i;
	}
	if(tmp>=flag) return 1;
	return 0;
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=1;i<=n;i++)
		a[i]=init();
		sort(a+1,a+n+1);
		flag=n*(n-1)/2+1;
		flag/=2;
		int l=0,r=a[n]-a[1],mid;
		while(l<=r)
		{
			mid=(l+r)/2;
			if(judge(mid)) r=mid-1;//P的值大了 
			else l=mid+1;
		}
		if(judge(l)) printf("%d\n",l);
		else printf("%d\n",r);
	}
	return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序设计思维与实践 Week4 作业 C TT 的神秘礼物 的相关文章

随机推荐

  • CSP第一次模拟 A 咕咕东的奇遇

    题目描述 xff1a 有一个圆环 xff0c 由字母表中字母首尾相接组成 环上有一个指针 xff0c 最初指向a 每次可顺时针或逆时针旋转一格 例如 xff1a a顺时针转到b xff0c 逆时针转到z 现在有一个字符串 xff0c 求需要
  • WEEK 5 B TT's Magic Cat

    题目 xff1a Thanks to everyone s help last week TT finally got a cute cat But what TT didn t expect is that this is a magic
  • WEEK 11 E 选做题1 东东与 ATM

    题目 一家银行计划安装一台用于提取现金的机器 机器能够按要求的现金量发送适当的账单 机器使用正好N种不同的面额钞票 xff0c 例如D k xff0c k 61 1 2 N xff0c 并且对于每种面额D k xff0c 机器都有n k张钞
  • Vue3.0的新语法糖-script setup

    lt script setup gt 是vue3中新引入的语法糖 xff0c 目的是简化使用Composition API时冗长的模板代码 lt script setup gt 是在单文件组件 SFC 中使用组合式 API 的编译时语法糖
  • MODIS数据下载——CSV模式直接下载hdf文件

    前提 xff1a 经常下载MODIS数据就会发现 xff0c NASA官网经常不干活 NSAS官网经常会有订单归档困难的情况 xff0c 不能通过订单批量下载 xff0c 这样就无法直接下载选定波段 经过投影与转tif处理后的数据了 订单批
  • python字符串切片及常用方法

    一 切片 切片 xff1a 指对操作的对象截取其中一部分的操作 xff0c 字符串 列表 元组都支持切片操作 语法 xff1a 序列 开始位置下标 结束位置下标 步长 xff0c 不包含结束位置下标数据 xff0c 步长为选取间隔 xff0
  • wsl2、Ubuntu、图形界面 的安装与问题解决

    关于WSL WSL是微软推出的windows的linux子系统 xff0c 目的就是为了在windows平台上更方便的运行 linux 相比于VMware这样的虚拟机产品 xff0c WSL有许多优势 xff1a 方便 WSL让Linux终
  • WSL安装,WSL上安装Ubuntu系统

    老规矩 xff0c 先上官方文档连接 xff1a https docs microsoft com zh cn windows wsl install win10 首先是在控制面板开启相关功能 先要在设置里面开启开发者选项 xff1a 在控
  • 【EHub_tx1_tx2_A200】Ubuntu18.04 + ROS_ Melodic + 锐驰LakiBeam 1L单线激光 雷达评测

    大家好 xff0c 我是虎哥 xff0c 最近这段时间 xff0c 又手欠入手了锐驰LakiBeam 1L激光雷达 xff0c 实在是性价比太优秀 xff0c 话说 xff0c 最近激光雷达圈确实有点卷 锐驰官网的资料已经很丰富 xff0c
  • WSL2 Ubuntu图形界面安装与远程桌面

    WSL是不支持显示图形界面的 xff0c 目前只支持命令行 WSL内部使用的是VM xff0c 运行真实的linux内核 xff0c 所以可以运行KDE Gnome xfce lxde等桌面环境的程序包 xff0c 但是无法直接显示 据说微
  • Ubuntu18.04设置国内源,提高下载速度

    2021 8更新 xff0c 不同版本的ubuntu国内源也是不一样的 xff0c 本文中的源仅适用于ubuntu18 04版本 xff0c 其他版本的ubuntu换源方法是一样的 xff0c 只是要修改的文件内容不一样 xff0c 有需要
  • WSL2文件操作慢的解决办法

    wsl1升级到wsl2跨 OS 文件系统的性能是降低的 xff0c 也就是在子系统中操作父windows系统上的文件 xff0c wsl2是较wsl1慢的 原因很简单 xff0c wsl2使用了VM来运行Linux内核 xff0c 在wsl
  • 关于将WSL子系统安装到其他位置(D盘、非C盘、非默认位置)后,clion无法检测到wsl的问题

    之前写了博客将wsl子系统安装的其他盘 xff0c 因为wsl默认是将子系统安装到C盘 xff0c 这样很容易导致C盘爆满 具体方法可见微软官网 xff08 很详细 xff0c 而且是中文 xff0c 这里就不在重复了 xff09 xff1
  • vue 页面刷新数据丢失、数据重置、数据缓存、data缓存、vuex缓存

    页面刷新数据丢失 在vue中data vuex store等都数据都是在内存当中的 xff0c 页面一旦刷新 xff0c 这些数据就会丢失 xff08 或者说被重置为初始值 xff09 xff0c 在某些时候很影响用户体验 缓存 xff0c
  • java 字符串连接(+、concat、StringBuffer/StringBuilder)效率比对

    三种方法 java字符串连接有三种方法 xff1a 用加号 43 连接 xff0c 如 xff1a 34 abc 34 43 34 bcd 34 String对象的concat方法 xff0c 如 xff1a 34 abc 34 conca
  • Integer.bitCount (int i)源码剖析

    文章目录 前言预备知识位与运算 96 amp 96 无符号右移 96 gt gt gt 96 补码 源码讲解基本原理两位二进制四位二进制32位的int 源码详解 总结 前言 最近在刷力扣题时 xff0c 刷到了一道统计数字二进制位里面1的数
  • 计算机基础必知必会——原码、反码与补码

    目录 引言需要解决的问题运算与硬件 最佳的编码方案原码原码的问题1 零的表示不唯一2 原码加减法运算繁杂 反码溢出与借位溢出借位 补码补码与正负数加法运算补码处理 正数 43 正数补码处理 正数 43 负数补码处理 负数 43 负数结论 使
  • vite报错: Dynamic require of “xxx“ is not supported

    原因 出现此类报错的原因是 引入的模块或者自己编写的源码 xff0c 甚至有可能是vite生成的代码中中有Commonjs风格的require xff0c 而浏览器环境是不支持require xff08 xff09 的 解决办法 手动修改源
  • docker运行nginx,绑定配置文件,失败原因及问题解决

    直接执行启动命令会失败 pull镜像 xff1a docker pull nginx 然后执行启动命令 xff1a docker run d p span class token number 80 span 80 p span class
  • 程序设计思维与实践 Week4 作业 C TT 的神秘礼物

    题目描述 xff1a TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪