在游戏《星际争霸 II》中,高阶圣堂武士作为星灵的重要 AOE 单位,在游戏的中后期发挥着重要的作用,其技能”灵能风暴“可以消耗大量的灵能对一片区域内的敌军造成毁灭性的伤害。

经常用于对抗人类的生化部队和虫族的刺蛇飞龙等低血量单位。

你控制着 n 名高阶圣堂武士,方便起见标为 1,2,⋅⋅⋅,n。

每名高阶圣堂武士需要一定的灵能来战斗,每个人有一个灵能值 ai 表示其拥有的灵能的多少(ai 非负表示这名高阶圣堂武士比在最佳状态下多余了 ai 点灵能,ai 为负则表示这名高阶圣堂武士还需要 −ai 点灵能才能到达最佳战斗状态)。

现在系统赋予了你的高阶圣堂武士一个能力,传递灵能,每次你可以选择一个 i∈[2,n−1],若 ai≥0 则其两旁的高阶圣堂武士,也就是 i−1、i+1 这两名高阶圣堂武士会从 i 这名高阶圣堂武士这里各抽取 ai 点灵能;若 ai<0 则其两旁的高阶圣堂武士,也就是 i−1,i+1 这两名高阶圣堂武士会给 i 这名高阶圣堂武士 −ai 点灵能。

形式化来讲就是 ai−1+=ai,ai+1+=ai,ai−=2ai。

灵能是非常高效的作战工具,同时也非常危险且不稳定,一位高阶圣堂武士拥有的灵能过多或者过少都不好,定义一组高阶圣堂武士的不稳定度为 maxni=1|ai|,请你通过不限次数的传递灵能操作使得你控制的这一组高阶圣堂武士的不稳定度最小。

输入格式
本题包含多组询问。输入的第一行包含一个正整数 T 表示询问组数。

接下来依次输入每一组询问。

每组询问的第一行包含一个正整数 n,表示高阶圣堂武士的数量。

接下来一行包含 n 个数 a1,a2,⋅⋅⋅,an。

输出格式
输出 T 行。

每行一个整数依次表示每组询问的答案。

数据范围
1≤T≤3,3≤n≤300000,|ai|≤109,

样例

输入样例1:
3
3
5 -2 3
4
0 0 0 0
3
1 2 3
输出样例1:
3
0
3
输入样例2:
3
4
-1 -2 -3 7
4
2 3 4 -8
5
-1 -1 6 -1 -1
输出样例2:
5
7
4

思路:贪心

选取a[i]传输灵能

1)假设a[i]>=0,则a[i-1]=a[i-1]+a[i],a[i]= -a[i],a[i+1]=a[i+1]+a[i]。考虑前缀和,思考便知:现s[i-1]=原s[i],现s[i]=原s[i-1],现s[i+1]=原s[i+1],故选取a[i]传输灵能的效果等同于把前缀和s[i-1]和s[i]交换。

2)假设a[i]<0,则a[i-1]=a[i-1]+a[i],a[i]=-a[i],a[i+1]=a[i+1]+a[i]。同样考虑前缀和,可得出和1)一样的结论。

综上:也就是说通过灵能的传输,可以得到任意的前缀和序列。而a[i]=s[i]-s[i-1],要想max(|a[i]|)也即max(|s[i]-s[i-1]|)最小,给s[i]数组排个序就好了。这一点很容易想到,你可以这样想:

假设有序序列: s1  s2  s3   s4  s5  s6  s7  s8  s9

s5乱序,序列变成:s1  s2  s5  s3  s4  s6  s7  s8  s9

观察改变后的差:s2-s1  s3-s2  s4-s3  s5-s4  s6-s5  s7-s6  s8-s7  s9-s8

        s2-s1  s5-s2  s3-s5  s4-s3  s6-s4  s7-s6  s8-s7  s9-s8

不同的部分如绿色阴影部分,可以发现s5乱序后,绿色阴影的绝对值都增大了,这样整个序列的不稳定度可能会增加,有序序列更优。同理s5放在s7和s8之间情况同理。

实际情况下,s序列是由好几个乱序组成的,而不仅仅是一个s5。但无论怎样乱序,从上面例子可以看出,只要乱序存在就一定比有序的稳定性差。

如果s[i]都是可移动的,我们可以通过交换操作(类似冒泡排序)使得s数组有序。但是,这题并非如此,依据题目要求sn的位置是固定的,还有吗?还有s0。引入s0是为了求a1,因为a1=s1-s0=s1-0,所以s0=0.

假如排序后序列为:s1  s2  s3  s4  s5  s0  s6  s7 sn  s8 s9  s10  s11,由于s0始终在第一个位置,sn始终在最后一个位置,我们可以把序列分为3个部分s1  s2  s3  s4  s5  s0  s6  s7  s8  sn  s9  s10  s11,中间部分有序不用处理,现在只需处理绿色和蓝色部分,这两部分处理相同,所以只讲如何处理绿色部分。

s0  _   _   _   _   _   s6,我们的任务就是把s1-s5填充到横线5个位置。如果只有两个数s5,s4,一定是

s0  s4  _   _   _  s5  s6   接着

s0   s4  s2  _  s3  s5  s6   最后

s0  s4  s2  s1  s3  s5  s6

这样排列,序列的稳定性最好。

代码:

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<stack>;
using namespace std;
const int maxn=300000+10;
const int inf=0x3f3f3f3f;
typedef long long ll;
ll s[maxn],s_ord[maxn];
int vis[maxn];
int main()
{
int t,n,x;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%d",&n);
s[0]=0;
//int ans_test=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
//ans_test=max(ans_test,x);
s[i]=s[i-1]+x;
}
ll sr=0,ed=s[n];
int pos1,pos2;
if(sr>ed)swap(sr,ed);
sort(s,s+n+1);
for(int i=0;i<=n;i++)
{
if(s[i]==sr)
{
pos1=i;
break;
}
}
for(int i=0;i<=n;i++)
{
if(s[i]==ed)
{
pos2=i;
break;
}
}
int l=0,r=n;
for(int i=pos1;i>=0;i-=2)
{
s_ord[l++]=s[i];
vis[i]=true;
}
for(int i=pos2;i<=n;i+=2)
{
s_ord[r--]=s[i];
vis[i]=true;
}
for(int i=0;i<=n;i++)
{
if(!vis[i])
s_ord[l++]=s[i];
}
ll ans=0;
for(int i=1;i<=n;i++)
if(abs(s_ord[i]-s_ord[i-1])>ans)
ans=abs(s_ord[i]-s_ord[i-1]);
printf("%lld\n",ans);
}
return 0;
}

  

第十届蓝桥杯大赛软件类省赛C/C++研究生组 试题I:灵能传输的更多相关文章

  1. 2019 第十届蓝桥杯大赛软件类省赛 Java A组 题解

    2019 第十届蓝桥杯大赛软件类省赛 Java A组 试题A 题解 ​ 题目最后一句贴心的提示选手应该使用 long (C/C++ 应该使用 long long). ​ 本题思路很直白,两重循环.外层 ...

  2. 第十届蓝桥杯大赛-特别数的和-C++

    解法一(暴力获取): #include<stdio.h> #include<stdlib.h> int main(void) { int n; ; ; printf(" ...

  3. 【第九届蓝桥杯大赛决赛真题】JAVA大学C组题解

    有空就会更新.... 有的题目重复了:再另一篇帖子:https://www.cnblogs.com/dgwblog/p/9090923.html 02 结果填空(满分29分) 标题:海盗与金币 12名 ...

  4. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  5. Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人

    扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...

  6. Java实现第十届蓝桥杯外卖店优先级

    试题 G: 外卖店优先级 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 [问题描述] "饱了么"外卖系统中维护着 N 家外卖店,编号 1 ∼ N.每家外卖店 ...

  7. Java实现第十届蓝桥杯旋转

    试题 F: 旋转 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 [问题描述] 图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时 针旋转 90 度. 我们用一个 ...

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

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...

  9. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

随机推荐

  1. CORS OPTIONS

    CORS OPTIONS A CORS preflight request is a CORS request that checks to see if the CORS protocol is u ...

  2. PAA房产,一家有温度的房产公司

    PAUL ADAMS ARCHITECT房产(以下简称PAA,公司编号:07635831)对每一个客户从心出,为他们选择优质房源,为他们缔造家的温暖.PAA房产,是一家有温度的房产公司. PAA房产( ...

  3. NGK.IO新一代高倍币BGV即将登陆交易所

    据悉NGK.IO新一代高倍币BGV已与全球前十大交易所进行深度恰谈,预计在不久的将来会完成上线计划.此次BGV的上线战略布局,将进一步扩大BGV生态,赋予BGV更多的便利性和发展空间.除此之外,NGK ...

  4. django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面

    1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...

  5. JVM性能调优经验总结

    本文转载自JVM性能调优经验总结 说明 调优是一个循序渐进的过程,必然需要经历多次迭代,最终才能换取一个较好的折中方案. 在JVM调优这个领域,没有任何一种调优方案是适用于所有应用场景的,同时,切勿极 ...

  6. 最实用JS 留着学习

    1.A标签删除 function input(){    var b = window.confirm("确认要删除本条信息!");    if(b==true){     ret ...

  7. JAVA 判断一个字符串是否是合法的日期格式?

    采用SimpleDateFormat类的parse方法进行判断,如果转换不成功,就会出现异常.另外,还需要判断字符串的长度,若不判断,第二个字符串就会验证通过,实际上也不是合法的.话不多说,且看代码: ...

  8. 后端程序员之路 52、A Tour of Go-2

    # flowcontrol    - for        - for i := 0; i < 10; i++ {        - for ; sum < 1000; {        ...

  9. Hi3559AV100 SDK的详细安装过程及问题解决方法

    下面给出Hi3559AV100 SDK的安装的详细步骤(一些注意事项可以参照我之前写的随笔-<Hi3519 SDK搭建.问题总结及yolov3 RFCN的运行结果与测试 >): 1.开发环 ...

  10. 微信小程序封装请求接口

    var rootDocment = 'https://123.com';//你的域名 function postData(url, data, cb) { wx.request({ url: root ...