第十届蓝桥杯大赛软件类省赛C/C++研究生组 试题I:灵能传输
在游戏《星际争霸 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:灵能传输的更多相关文章
- 2019 第十届蓝桥杯大赛软件类省赛 Java A组 题解
2019 第十届蓝桥杯大赛软件类省赛 Java A组 试题A 题解 题目最后一句贴心的提示选手应该使用 long (C/C++ 应该使用 long long). 本题思路很直白,两重循环.外层 ...
- 第十届蓝桥杯大赛-特别数的和-C++
解法一(暴力获取): #include<stdio.h> #include<stdlib.h> int main(void) { int n; ; ; printf(" ...
- 【第九届蓝桥杯大赛决赛真题】JAVA大学C组题解
有空就会更新.... 有的题目重复了:再另一篇帖子:https://www.cnblogs.com/dgwblog/p/9090923.html 02 结果填空(满分29分) 标题:海盗与金币 12名 ...
- 第十届蓝桥杯JavaC组省赛真题
试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...
- Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人
扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...
- Java实现第十届蓝桥杯外卖店优先级
试题 G: 外卖店优先级 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 [问题描述] "饱了么"外卖系统中维护着 N 家外卖店,编号 1 ∼ N.每家外卖店 ...
- Java实现第十届蓝桥杯旋转
试题 F: 旋转 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 [问题描述] 图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时 针旋转 90 度. 我们用一个 ...
- 第十届蓝桥杯2019年C/C++ 大学B组省赛试题
2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...
- 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)
先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...
随机推荐
- DevOps in Action
DevOps in Action DevOps is a set of software development practices that combines software developmen ...
- uniapp 修改meta:viewport
onLoad(options) { this.setViewport(`width=device-width, initial-scale=1.0`); }, onUnload() { this.se ...
- NGK.IO超级节点是我们掌握的下一个财富密码吗?
从日前NGK.IO发布的新闻中,我们捕捉到了一个非常重要的信息,那就是反复被提到的"超级节点".很多人都对这个"超级节点"一头雾水,这个"超级节点&q ...
- C语言数据类型思维导图
- 翻译:《实用的Python编程》01_06_Files
目录| 上一节(1.5 列表) | 下一节 (1.7 函数) 1.6 文件管理 大多数的程序需要从某处读取输入.本节讨论文件访问. 文件输入和输出 打开一个文件: f = open('foo.txt' ...
- 为什么Linux默认页大小是4KB
本文转载自为什么 Linux 默认页大小是 4KB 导语 我们都知道 Linux 会以页为单位管理内存,无论是将磁盘中的数据加载到内存中,还是将内存中的数据写回磁盘,操作系统都会以页面为单位进行操作, ...
- 三种远程部署war包检测
简介 远程部署漏洞属于服务器.中间件配置问题,攻击者可通过远程部署漏洞获取系统权限,远程部署漏洞经常出现在Tomcat.Jboss.Weblogic等web容器之上. 0x01 ### tomcat部 ...
- python基础(2)字符串常用方法
python字符串常用方法 find(sub[, start[, end]]) 在索引start和end之间查找字符串sub 找到,则返回最左端的索引值,未找到,则返回-1 start和end都可 ...
- 将日志发送到log日志文件中
log.debug("toUser:"+toUser+",subject:"+subject+",content:"+content);
- Vue学习笔记-Vue.js-2.X 学习(三)===>组件化高级
(四) 组件化高级 1.插槽(slot)的基本使用 A:基本使用: <slot></slot> B:默认置:<slot><h1>中间可以放默认值< ...