蓝桥杯 — —灵能传输

news2024/11/27 9:46:38

灵能传输

友情链接:灵能传输

题目:

在这里插入图片描述
在这里插入图片描述

输入样例:

3
3
5 -2 3
4
0 0 0 0
3
1 2 3

输出样例:

3
0
3

思路:

题目大意:给出一个数组,每次选择数组中的一个数(要求不能是第一个数与最后一个数),如果这个数是一个正数,就将这个数减去自身两次,并且将相邻的两个数分别加上这个数一次,如果这个数是负数,就将这个数减去自身两次,并且将相邻的数加上这个负数两次,(本质上第二种情况与第一种情况一样,因为减去负数相当于加上这个负数的绝对值),使用公式表述为: a i − 1 + = a i          a i + 1 + = a i          a i − = 2 a i a_{i - 1} += a_i ~~~~~~~~ a_{i + 1} += a_i~~~~~~~~a_i -= 2a_i ai1+=ai        ai+1+=ai        ai=2ai并且记住选择的i不能是第一个数或最后一个数

具体思路:

通过尝试可知,公式与每一个数的前缀和有极大的关系,举例:对于数组5 -2 3 4而言,其前缀和为5 3 6 10,如果选择的是-2,那么原数组的值会变为:3 2 1 4,变化后的数组前缀和为:3 5 6 10,相当于将原数组的前缀和中的第一个位置与第二个位置进行了交换,再看还是对于数组5 -2 3 4而言,如果选择的是3,那么原数组的值会变为5 1 -3 7,对应的前缀和为5 6 3 10,相当于对原数组的前缀和数组的第二个位置与第三个位置进行了交换。下图为更直观的理解:

请添加图片描述

由此我们可以得出一个规律:如果对某一个位置i进行操作,相当于对前缀和数组中ii - 1位置的值进行交换。其中:1 < i < n

这样我们就可以得出一个简单的解决方案了,题目要求的是使原数组中数值的绝对值的最大值最小化,一个简单的思路是对前缀和数组进行排序,因为这样可以保证相邻两个前缀和数值的差值最小,这样就保证了原数组中的数值的最大值最小化。

但是题目还有一个条件,就是不能对第一个位置和最后一个位置进行操作,如果直接对前缀和数组(前缀和数组表示为: S S S)进行排序(包含了 S 0 S_0 S0 S n S_n Sn),那么就违反了题目的要求。我们这样思考:如果对 a 1 a_1 a1(原数组用 a a a表示)进行操作,那么对应的前缀和变化是交换 S 0 S_0 S0 S 1 S_1 S1(其中 S 0 = 0 S_0 = 0 S0=0 ),如果对 a n a_n an进行操作,那么对应的前缀和数组的变化是交换 S n S_n Sn S n − 1 S_{n - 1} Sn1,为了不使 S 0 S_0 S0 S n S_n Sn移动,我们这两个数进行移动,我们需要让起点仍然是因为 S 0 S_0 S0 S n S_n Sn,但为了使相邻两个值之间的差值最小,我们需要使用一些策略:如从 S 0 S_0 S0的位置进行步长为2向前进行取值正序填充到一个新的数组中去并且进行标记,在 S n S_n Sn的位置也进行步长为2向后进行取值,逆序(即:从新数组的最后一个位置开始进行填充)填充到一个新的数组中去并且进行标记,最后从头开始遍历排序后的前缀和数组,将还未标记的值按顺序一次填充到新的数组的空余位置。

还有一个问题: S 0 S_0 S0如果大于 S n S_n Sn该如何解决?

对于这种情况:我们只需要在查找 S 0 S_0 S0 S n S_n Sn的位置的时候 S 0 S_0 S0 S n S_n Sn的位置进行交换即可,这样就变为了 S n S_n Sn向前进行步长为2的取值, S 0 S_0 S0向后进行步长为2的移动。下图为一个直观的理解:
请添加图片描述

记得要使用long long数据类型,因为int类型的数据最大在 1 0 9 10^9 109左右,而题目要求的 a i a_i ai的值小于等于 1 0 9 10^9 109,其前缀和数组的值可能会超过int的存储容量。

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
void solve(){
	int n; cin>>n;
	vector<ll> A(n + 1, 0);
	vector<ll> S(n + 1, 0);
	for(int i = 1;i <= n;i ++){
		cin>>A[i];
		S[i] += S[i - 1] + A[i];
	}
	
	// 记录S中的第一个位置与最后一个位置
	ll front = S[0];
	ll end = S[n];
	if(front > end) swap(front, end);
	// 对前缀和数组进行顺序排序
	sort(S.begin(), S.end());   // 排序的时候包含了第0个位置的数 
	
	// 找到原来S数组的第一个位置和最后一个位置的数在排序后的数组中的下标
	for(int i = 0;i <= n;i ++){
		if(S[i] == front){
			front = i;
			break;
		}
		
	}
	for(int i = n;i >= 0;i --){   // 这里遍历也可以从0开始到n结束
		if(S[i] == end){
			end = i;
			break;
		}
		
	}

	vector<ll> ans(n + 1, 0);
	// 设定标记数组
	vector<ll> cnt(n + 1, 0);
	ll frontidx = 0;
	ll endidx = n; 
	// 从idxf向前进行找
	for(int i = front;i >= 0;i -= 2){
		ans[frontidx++] = S[i];
		cnt[i] = 1;
	}
	// 从idxe向后进行找 
	for(int i = end;i <=n ;i += 2){
		ans[endidx --] = S[i];
		cnt[i] = 1;
	}
	// 将剩下的数进行填充 
	for(int i = 0;i <= n;i ++){
		if(!cnt[i]){
			ans[frontidx++] = S[i];
		}
	}
	
	// 从ans数组中找到相邻两个数之间的最小的值
	ll tans = 0;
	for(int i = 1;i <= n;i ++){
		tans = max(tans, abs(ans[i] - ans[i - 1]));
	}
	cout<<tans<<endl;
	return ;
} 

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t = 1; cin>>t;  // t组询问 
	while(t--){
		solve();
	}
	return 0;
} 

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust语言入门第二篇-Cargo教程

文章目录 Rust语言入门第二篇-Cargo教程一&#xff0c;Cargo 是什么二&#xff0c;Cargo教程Cargo.toml文件src/main.rs 文件构建并运行Cargo项目 Rust语言入门第二篇-Cargo教程 本节提供对cargo命令行工具的快速了解。我们演示了它为我们生成新包的能力&#xff0c;它在包内编…

数据分类分级概念、方法

数据分类分级概念&#xff1a; 根据《GB/T 38667-2020 信息技术-大数据-数据分类指南》的定义&#xff0c;数据分类是根据数据的属性或特征&#xff0c;按照一定的原则和方法进行区分和归类&#xff0c;以便更好地管理和使用数据。数据分类不存在唯一的分类方式&#xff0c;会…

KKVIEW远程远程访问家里电脑

远程访问家里电脑&#xff1a;简易指南与价值所在 在数字化时代&#xff0c;电脑已成为我们日常生活和工作中不可或缺的工具。有时&#xff0c;我们可能在外出时急需访问家中电脑里的某个文件或应用&#xff0c;这时&#xff0c;远程访问家里电脑就显得尤为重要。本文将简要介…

中移物联网 OneOS 操作系统环境搭建和工程创建

一、官网 OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统&#xff0c;具有可裁剪、跨平台、低功耗、高安全等特点&#xff0c;支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构&#xff0c;兼容POSIX、CMSIS等标准接口&#xff0c;支持Javascript、MicroPyt…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…

【Dijkstra单源最短路径解法】蓝桥杯2022年第十三届决赛真题-出差

我也来贡献一份题解&#xff1a;Dijkstra单源最短路径的简单变式【简单C代码】 这道题的前置知识的Dijkstra单源最短路径算法 如果还没学过&#xff0c;建议去看AcWing算法教程的**图论(2)**中最短路径问题的讲解,u1s1–y总讲的是真的通透&#xff01; 思路 这道题和单源最短路…

【AI面试】FPN、PANet、SPP、ASPP、Adaptive feature pooling

经常可以看到各个论文发出来,加入的各种trick。这些改进点,一般都是在前人的基础上,进行了一些修改。比如FPN到PANet的改进,就是为了改进前者存在的一些问题。 这里就把这些trick,给汇集到一起,看看他们的发展历史,看看他们之间有什么区别,又是在哪些地方做的改进。这…

C++ stl容器string的底层模拟实现

目录 前言&#xff1a; 1.成员变量 2.构造函数与拷贝构造函数 3.析构函数 4.赋值重载 5.[]重载 6.比较关系重载 7.reserve 8.resize 9.push_back,append和重载 10.insert 11.erase 12.find 14.迭代器 15.流插入&#xff0c;流提取重载 16.swap 17.c_str 18.完…

【Linux】shell脚本实战-if单双分支条件语句详解

if单分支 在所有的编程语言里面&#xff0c;if条件语句几乎是最简单的语句格式&#xff0c;且用途最广。 当if后面的<条件表达式>成立&#xff08;真&#xff09;的时候&#xff0c;就会执行then后面的指令或语句&#xff0c;否则&#xff0c;就会忽略then后面的指令或…

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果 一、简单介绍 二、简单视频浮雕画效果实现原理 三、简单视频浮雕画效果…

基于微信小程序的短文写作竞赛管理系统

采用技术 基于微信小程序的短文写作竞赛管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 小程序端 登录 首页 竞赛信息界面 竞赛成果界面 学生…

2024个人动态线条导航HTML源码

源码介绍 2024个人导航HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码下载 2024个人导航HTML源码

Django Rest Framework的序列化和反序列化

Django Rest Framework的序列化和反序列化 目录 Django Rest Framework的序列化和反序列化Django传统序列化Django传统反序列化安装DRF序列化器serializers序列化反序列化反序列化保存instance和data CBV和APIView执行流程源码解析CBV源码分析APIView源码分析 DRF的Request解析…

KVM部署

1、检查虚拟化支持 首先&#xff0c;确认你的系统处理器支持硬件虚拟化&#xff0c;在Linux终端中&#xff0c;使用以下命令&#xff1a; egrep -c (vmx|svm) /proc/cpuinfo2、安装KVM及其工具 yum update yum install qemu-kvm libvirt libvirt-python libguestfs-tools vi…

FPGA - 以太网UDP通信(二)

一&#xff0c;引言 前文链接&#xff1a;FPGA - 以太网UDP通信&#xff08;一&#xff09; 在上文章中介绍了以太网简介&#xff0c;以太网UDP通信硬件结构&#xff0c;以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c;接下来介绍UDP通信结构框图以及数据链路层&#xff…

政安晨:【Keras机器学习实践要点】(二十六)—— 内卷神经网络

目录 简介 设置 卷积 演变 测试逆卷积层 图像分类 获取 CIFAR10 数据集 数据可视化 卷积神经网络 逆向传播神经网络 比较 损失图和准确率图 可视化卷积核 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Ke…

从 SQLite 3.5.9 迁移到 3.6.0(二十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;从 SQLite 3.4.2 迁移到 3.5.0&#xff08;二十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​SQLite 版本 3.6.0 &#xff08;2008-07-16&#xff09; 包含许多更改。按照惯例 SQLite项目&#xff…

FPGA在医疗的应用,以4K医疗内窥镜为例

前言 随着技术的发展&#xff0c;医学影像作为科学技术的主要成就之一&#xff0c;在无创诊断和治疗领域已经有了多种应用。其中一个应用是内窥镜&#xff0c;在20世纪90年代&#xff0c;当利用电荷耦合装置将图像传输到显示器上成为可能时&#xff0c;内窥镜变得更加广泛。为…

自动化测试框架 Selenium(3)

目录 1.前言 2.等待方式 2.1死等 2.2智能等待 3.游览器操作 3.1游览器最大化 3.2设置游览器的宽 高 3.3 游览器的前进和后退 3.4游览器滚动条 1.前言 本篇博客,我们将继续Selenium自动化测试的学习.在前面的章节中,俺介绍了Selenium是怎么回事,和键盘鼠标操作.还有url和…