蓝桥杯后缀表达式

蓝桥杯后缀表达式

【问题描述】

给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1,A2,··· ,AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。 例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分

【输入格式】

第一行包含两个整数 N 和 M。
第二行包含 N + M + 1 个整数 A1,A2,··· ,AN+M+1

【输出格式】

输出一个整数,代表答案。

解题思路:

  1. 获得并存储数据
  2. 对数据进行全排
  3. 去重操作(使用Set集合可以去重)
  4. 对全排的数组进行整合
  5. 获得结果

输入样例:

2 3
1 2 3 4 5 6

结果:

9

java完整代码:

package demo.yrs;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class SuffixExpression{
	
	/* 后缀表达式 */
	/* Set集合用来存储 全排后的 数据 */
	//数据可能出现的情况
	static Set<int[]> setArr = new HashSet<>();
	//运算符可能出现的情况
	static Set<char[]> setArr1 = new HashSet<>();

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int resultMax= 0;
		int n = sc.nextInt();
		int m = sc.nextInt();
		int [] nums = new int[n+m+1];
		char [] marks = new char[n+m];
		for (int i = 0; i < n; i++) {
			marks[i] = '+';
		}
		for (int i = n; i < n+m; i++) {
			marks[i] = '-';
		}
		for (int i = 0; i < nums.length; i++) {
			nums[i]=sc.nextInt();
		}
		sc.close();
		/* 全排数字 */
		allSort(nums, 0, nums.length);
		/* 全排运算符 */
		allSortChar(marks, 0, marks.length);
		
		/* 遍历符号集合 符号出现的所有可能 */
		for (char[] d : setArr1) {
				/* 遍历数字集合 */
				for (int[] c : setArr) {
				//对每种数据和运算符进行  组合
					int max = 0;
					//数值求和  c.length-1 是因为 每次操作都是操作后一个数据,到了最后一个数据不用进行操作
					for (int i = 0; i < c.length-1; i++) {
						if(i ==0 ) {
							max+=c[i];
						}
						if(d[i] == '+') {
							max+=c[i+1];
						}
						if(d[i] == '-'){
							max-=c[i+1];
						}		
					}
					
					if(max>resultMax) {
						resultMax = max;
					}
				}
		}
		System.out.println(resultMax);
		
	}
	public static void swap(int [] nums,int i,int j) {
		int temp = nums[i];
		nums[i] = nums[j];
		nums[j] =temp;
	}
	public static void allSort(int [] nums,int start,int end) {
		if(start == end) {
			int[] a = new int[nums.length];
			for (int i = 0; i < nums.length; i++) {
				a[i] =nums[i];
			}
			setArr.add(a);
		}else {
			for (int i = start; i < end; i++) {
				swap(nums,i,start);
				allSort(nums,start+1,end);
				swap(nums,start,i);
			}
		}
	}
	public static void swapChar(char [] nums,int i,int j) {
		char temp = nums[i];
		nums[i] = nums[j];
		nums[j] =temp;
	}
	public static void allSortChar(char [] nums,int start,int end) {
		if(start == end) {
			char[] a = new char[nums.length];
			for (int i = 0; i < nums.length; i++) {
				a[i] =nums[i];
			}
			setArr1.add(a);
		}else {
			for (int i = start; i < end; i++) {
				swapChar(nums,i,start);
				allSortChar(nums,start+1,end);
				swapChar(nums,start,i);
			}
		}
	}
}

你可能感兴趣的:(蓝桥杯)