蓝桥杯 灵能传输
程序员文章站
2022-03-08 12:16:39
...
【输出格式】
输出T 行。每行一个整数依次表示每组询问的答案。
【样例输入】
3
3
5 -2 3
4
0 0 0 0
3
1 2 3
【样例输出】
3
0
3
【样例说明】
对于第一组询问:
对2 号高阶圣堂武士进行传输操作后a1 = 3,a2 = 2,a3 = 1。答案为3。
对于第二组询问:
这一组高阶圣堂武士拥有的灵能都正好可以让他们达到最佳战斗状态。
【样例输入】
3
4
-1 -2 -3 7
4
2 3 4 -8
5
-1 -1 6 -1 -1
【样例输出】
5
7
4
每次找出绝对值最大的数,然后判断其两边
是否有与它异号
的数,如果存在,进行灵能传输才有可能使得这个最大的数变小。如果是同号则进行灵能传输则只会使得最大值更大。以此思路进行编程。
我写的代码比较长,主要是有两个基本相同的函数,函数也比较简单。
本程序没有经过大量数据测试,不敢保证结果的正确性。
package ten;
import java.util.Scanner;
//灵能传输
public class one_new {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int flag[] = new int[N]; //存储每组数据的最大值
for(int i=0;i<N;i++) { //N组数据
int n = in.nextInt(); //n个战士
int A[] = new int[n+2]; //存储灵能值
A[0] = Integer.MAX_VALUE; // 边界 貌似没什么用
A[n+1] = Integer.MAX_VALUE;
int MAX[] = new int[n]; //存储每次循环所求的的最大值
for(int j =1;j<=n;j++) {
A[j] = in.nextInt();
}
for(int j=0;j<n;j++) {
int max = getMax(A); //获取最大绝对值数 的下标
int max_value = A[max]; // 2 5 4 -8
// 0000 -1 -1 6 -1 -1 0000
MAX[j] = max_value; //每次循环保存记录最大
//
if(A[max]>0) { //最大值大于0 然后判断两边是否有小于0 的数
if(A[max-1]<0 && max!=1) {
chuanshu_1(A,max-1);
}else if(A[max+1]<0 && max!=n) {
chuanshu_1(A,max+1);
}
}else if(A[max]<0) {
if(A[max-1]>0 && max!=1) {
chuanshu_1(A,max-1);
}else if(A[max+1]>0 && max!=n) {
chuanshu_1(A,max+1);
}
}
}
//每组绝对值最大保存记录
flag[i]=Math.abs(MAX[getMin(MAX)]);
}
//打印最终结果
for(int i=0;i<N;i++)
System.out.println(flag[i]);
}
//用于负数与正数的传输 两种传输方法实际上是一样的,一个函数就可以实现
static void chuanshu_1(int []A , int i) { //小于0 要增加 两边减少
A[i+1] = A[i+1] + A[i];
A[i-1] = A[i-1] + A[i];
A[i] = A[i] - 2*A[i];
}
//获取绝对值最大的数
static int getMax(int []A) {
int max=1;
//找出最大值 可能是正数
for(int i=1;i<A.length-2;i++) {
if(Math.abs(A[max])<Math.abs(A[i+1])) {
max = i+1;
}
}
return max;
}
//获取绝对值最小值 与getMax()函数基本思路相同
static int getMin(int []A) {
int min=0;
//找出最大值 可能是正数
for(int i=0;i<A.length-1;i++) {
if(Math.abs(A[min])>Math.abs(A[i+1])) {
min = i+1;
}
}
return min;
}
}
下一篇: html jquery li标签 选中