藍橋杯2019年真題:字尾表示式

入夢鏡發表於2020-10-07

題目

時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分

【問題描述】 

給定 N 個加號、M 個減號以及 N + M + 1 個整數 A1,A2,··· ,AN+M+1,
小明想知道在所有由這 N 個加號、M 個減號以及 N + M +1 個整數
湊出的合法的字尾表示式中,結果最大的是哪一個?
請你輸出這個最大的結果。 
例如使用1 2 3 + -,則 “2 3 + 1 -” 這個字尾表示式結果是 4,是最大的。

【輸入格式】
第一行包含兩個整數 N 和 M。 第二行包含 N + M + 1 個整數 A1,A2,··· ,AN+M+1。

【輸出格式】
輸出一個整數,代表答案。

【樣例輸入】 
1 1 1 2 3
【樣例輸出】 
4
【評測用例規模與約定】 
對於所有評測用例,0≤ N,M ≤100000,−109 ≤ Ai ≤109

答案

這道題的第一個坑,可能你們不知道字尾表示式的定義是什麼.
字尾表示式是運算子位於運算元之後,計算機從左到右掃描表示式,
遇到數字就直接入棧,遇到運算子就彈出棧頂兩個數進行計算,
將結果壓入數棧,一直重複得到結果

具體的可以看這篇文章

知道通過了第一個坑還有可能進入第二個坑,你有可能在想,將這些數字按照從小到大
進行排序,然後用所有的加號將大的數值加起來,然後將所有小的數值減了,
因為你覺得這道題沒有括號和優先順序之類的
但是這樣又錯了
字尾表示式是本來沒有括號但是又有優先順序的表示式,比如:
+,+,-,-,1,2,3,4,5
如果是5+4+3-2-1=9
如果是字尾表示式5 4 3 + + 1 2 - - =13
對應中綴表示式5+4+3-(1-2)=13
所以這道題加上了字尾表示式就是有優先順序的了
現在就是這道題所有的數中有正有負

如果所有都是正數,我們可以使用一個減號將其他的減號變成加號,有多少個減號
就將多少個減號放在括號裡面讓它變成加號,所以結果就是:
除了最小的數,所有的數加起來減去最小的數,就是
A+(B+C)-D

如果都是負數,就用加號的全部放在括號中讓他變成正數,所以結果就是:
除了最大的數,其他的都是可以變成正數,可以改成
A+(B+C)-D

如果有正有負有,也是將負的全部變成正數,減號不夠就用括號括起來再減
所以還是全部的絕對值加起來減去一個絕對值最小的
A+(B+C)-D

上面的(B+C)就是無論正負都可以變成正數的數,
上面所有的分類都是所有的數加起來,然後減去最小的,因為想將負數變成正數,必須
用減號來將它改成正數,但是最開始那個被減數就不能弄成正的
package competition3;

import java.util.Scanner;

public class ExpressionOfMy
{
	public static int N,M;
	public static int[] number;
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		N=in.nextInt();
		M=in.nextInt();
		number=new int[N+M+1];
		int min=0,max=0;
		for(int x=0;x<number.length;x++)
		{
			number[x]=in.nextInt();
			if(number[min]>number[x])
			{
				min=x;
			}
			if(number[max]<number[x])
			{
				max=x;
			}
		}
		long sum=0;
		
		if(M==0)
		{
			for(int x=0;x<number.length;x++)
			{
				sum +=number[x];
			}
			System.out.println(sum);
		}
		else
		{
			for(int x=0;x<number.length;x++)
			{
				sum +=Math.abs(number[x]);
			}
			
			sum=(sum-Math.abs(number[max])-Math.abs(number[min]))+(number[max]-number[min]);
			System.out.println(sum);			
		}
		in.close();
	}
}

相關文章