1.分析题目条件

题中允许对高阶圣堂武士进行的变换操作是 a[ i - 1 ] += a[ i ],a[ i + 1 ] += a[ i ],a[ i ] = - a[ i ]  ,i 属于 [2 , n-1]

需要通过若干次变换操作,得到最小的 max{ | a[ i ] | }

这个变换操作很复杂,不易求解。

2.前缀和形式

尝试转化为前缀和形式,a[ 1 ] ~ a[ n ] 求取前缀和,记为 s[ 1 ] ~ s[ n ]

此时的 a[ 1 ] ~ a[ n ] 变为 s[ 1 ],s[ 2 ] - s[ 1 ],s[ 3 ] - s[ 2 ] …… s[ n ] - s[ n - 1 ]

看看转化后的变换操作

如对 i = 2 使用变换操作 ,那么 s[ 1 ] —> s[ 2 ],s[ 2 ] —> s[ 1 ],s[ 3 ] —> s[ 3 ]

发现对 i 进行变换操作,会导致 s[ i - 1 ] 和 s[ i ] 交换

如此,前缀和形式的变换操作是不是简单的多了!

3.完善前缀和数列

经上分析,我们可以在 s[ 1 ] ~ s[ n - 1 ] 之间的数进行任意交换,使 s[ 1 ],s[ 2 ] - s[ 1 ],s[ 3 ] - s[ 2 ]…,s[ n ] - s[ n - 1 ] 之间差的绝对值的最大值最小

等等!只有第一项是 s[ 1 ] 的形式,后面都是相减的形式,这是不是很难受

补上 s[ 0 ] = 0

这样,我们的题目就转化成为了

在 s[ 1 ] ~ s[ n - 1 ] 之间的数进行任意交换,使 s[ 1 ] - s[ 0 ],s[ 2 ] - s[ 1 ],s[ 3 ] - s[ 2 ]…,s[ n ] - s[ n - 1 ] 之间差的绝对值的最大值最小

4.求解

如果 s[ 0 ] ~ s[ n ] 之间都能随意交换,那差的绝对值的最大值最小显然是排序后,这时数列单调,两个数之差必然是最小哒。

但条件固定了 s[ 0 ] 和 s[ n ] 这两个点!

这意味着固定了起点和终点,要想得到差的最小值当然还是需要排序,但取数就不能是一个一个取了。

排序后起点和终点一般情况就不再是在两端,而是在中间。由于我们要的是差的绝对值,所以我们以 s[ 0 ] 做起点还是以 s[ n ] 做起点都是可以的!

我们设 min{ s[ 0 ],s[ n ] } 做起点,max{ s[ 0 ],s[ n ] }做终点;还需要注意的是特殊情况,即 s[ 0 ] == s[ n ] 时,我们须确保起点的下标要小于终点的下标,不然会发生取数产生重叠区。

如上图所示,取数以起点开始到最小值,再到最大值,最后到达终点。

还有一个问题,那就是上图中存在两段重叠区。重叠区取数也必须要保证向左时和向右时差的绝对值的最大值最小!

隔一个数取一个数显然是最好的解决办法了,向左取数时候就留下了间隔一个数的一组数,留下之后反方向向右取的数。

取数完成后遍历一遍找到差绝对值的最大值,输出。

结束!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5;
ll a[N],s[N];
bool vis[N];
int n;
int main(){int T;scanf("%d",&T);while(T--){memset(vis,0,sizeof(vis));scanf("%d",&n);s[0]=0;for(int i=1;i<=n;++i){scanf("%lld",&s[i]);s[i]+=s[i-1];}ll s0=0,sn=s[n];if(s0>sn) swap(s0,sn);//前小后大,为方便取数,可避免讨论取数时重复取的问题。 sort(s,s+n+1);int l=0,r=n;for(int i=lower_bound(s,s+n+1,s0)-s;i>=0;i-=2){//隔数取数a[l++]=s[i],vis[i]=1;}for(int i=lower_bound(s,s+n+1,sn)-s;i<=n;i+=2){a[r--]=s[i],vis[i]=1;}for(int i=0;i<=n;++i){if(!vis[i]) a[l++]=s[i];}ll res=0;for(int i=1;i<=n;++i)res=max(res,abs(a[i]-a[i-1]));printf("%lld\n",res);}return 0;
}

感谢原文,原文链接:原文

蓝桥杯 2019第十届蓝桥杯 B组J题灵能传输 题解 思路相关推荐

  1. 蓝桥杯第十届省赛java组解析(灵能传输 四星难度,后缀表达式 两星难度)

    第一题太简单懒得复制题目了 答案是:490 第二题: 试题 B: 不同子串 本题总分:5 分 [问题描述] 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串.例如,字符串aa ...

  2. 【蓝桥】2019第十届蓝桥杯省赛C/C++大学B组题目及感想(考场代码和思考)

    比赛时间:2019年3月24日礼拜天 上午9点到下午1点 说明 本文题目和代码为考试结束以后返回考场拷下来的 文中答案不保证正确(感觉错的地方还不少) 本文解题思路和代码只反映本人考场临场发挥情况,真 ...

  3. 2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解

    ============================== 2019-2021蓝桥杯C++ C组真题题解: 2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解 2020第十一届蓝桥杯大赛软件类省 ...

  4. 2019第十届蓝桥杯大赛软件类省赛C++ B组真题题解

    ========================================== 2019-2021蓝桥杯C++ B组真题题解: 2019第十届蓝桥杯大赛软件类省赛C++ B组真题题解 2020第 ...

  5. 2019第十届蓝桥杯A组决赛(国赛)A题(三升序列)

    2019第十届蓝桥杯A组决赛(国赛)A题(三升序列) 输入: VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG SDLLOVGRTWEYZKKXNK ...

  6. 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc

    糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述]    ...

  7. 2019第十届蓝桥杯JAVA G组题解

    蓝桥杯历年真题及解析. 试题 A: 立方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 ...

  8. 2019第十届蓝桥杯省赛总结

    第十届蓝桥杯是在郑州的河南农大龙子湖校区举办的,这是我第一次参加蓝桥杯比赛,前一天晚上在酒店住的,因为自己也不知道自己成绩能如何,所以也就一直睡不着:第二天早上九点开始比赛的,比赛时长为4个小时,下午 ...

  9. 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解

    第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...

最新文章

  1. 【ZooKeeper Notes 14】数据模型
  2. 微信公众号中网页安全提示去掉
  3. [原] 64位win7编译OpenCV SVN版本
  4. secFox setting
  5. 每日两SQL(8),欢迎交流~
  6. Jquery中的this是什么类型
  7. day10 Pyhton学习
  8. 【转】DICOM医学图像读取涉及到的医学坐标体系
  9. 兼容的min-height
  10. 谈论 NOD32: 教育网超级 病毒更新服务器: http://222.197.166.33/main.htm
  11. 【Java从0到架构师】SpringBoot - MyBatis
  12. iptables原理知识
  13. mysqldump mysql.sock_mysqldump原理及实战
  14. Photo Album: MSN中国版头像
  15. 虚拟机中标麒麟的网络设置
  16. 教育研究方法 的思维导图
  17. OSG绘制空间凹多边形以及透明效果的实现
  18. python2代码转换为python3
  19. 中国历史朝代歌:夏商与西周,东周分两段
  20. 我的阅读习惯 俞敏洪

热门文章

  1. centos7 安装Netdata
  2. java泛型之自限定类型和参数协变
  3. DVWA下载、安装、配置
  4. uevent 驱动_uevent分析(和设备驱动有关)
  5. php 笔试题doc,php笔试试题.doc
  6. 基于内容推荐算法实现原理
  7. 物联网相关连接总结 - 摄像头、传感器
  8. 约瑟夫环c语言循环指针,约瑟夫环(c语言)(双循环、单循环)
  9. 性能优化——FBX设置优化Model面板部分
  10. 谁才是天朝最厉害的演员?让Python来为你揭晓!