文章目录
题目描述
题目背景
在游戏《星际争霸 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.
灵能是非常高效的作战工具,同时也非常危险且不稳定,一位高阶圣堂武士拥有的灵能过多或者过少都不好,定义一组高阶圣堂武士的不稳定度为:
请你通过不限次数的传递灵能操作使得你控制的这一组高阶圣堂武士的不稳定度最小。
输入描述
输出描述
输入输出样例
输入:
3
3
5 -2 3
4
0 0 0 0
3
1 2 3
输出:
3
0
3
最终代码
1. c/c++
#include<bits/stdc++.h>
using namespace std;
const int N=3e5;
long long a[N],s[N];
bool vis[N];
int main()
{
int T; scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
int n; scanf("%d",&n);
s[0]=0;
for(int i=1;i<=n;++i)
{
scanf("%lld",&s[i]);
s[i] += s[i-1]; //计算前缀和
}
long long 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)
//图中的路线1: 从s0到min。隔一个数取一个
a[l++]=s[i], vis[i]=1;
for(int i = lower_bound(s,s+n+1,sn)-s;i<=n;i+=2)
//图中的路线3: 从max到sn。隔一个数取一个
a[r--]=s[i], vis[i]=1;
for(int i=0;i<=n;++i) //图中的路线2:从min到max
if(!vis[i])
a[l++]=s[i];
long long res=0;
for(int i=1;i<=n;++i)
res = max(res,abs(a[i]-a[i-1]));
printf("%lld\n",res);
}
return 0;
}
2. java
3. python