蓝桥杯 灵能传输

在这里插入图片描述
【输出格式】
输出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;
		}

}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值