字尾表示式

2021-10-02 06:51:17 字數 1796 閱讀 2664

給定 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, · · · , a(n+m+1).

輸出乙個整數,代表答案。

1 1

1 2 3

對於所有評測用例,0 ≤ n, m ≤ 100000, -10^9 ≤ ai ≤ 10^9。

我們需要討論負數的個數和 m 的關係:

1、給定的數字本身中負數的個數等於 m,那麼顯而易見把所有的負數配合負號全部變為正數。

2、給定的數字本身中負數的個數小於 m,這種情況下要分兩種小情況進行考慮。

(1)當全部是正數,那麼把 m-1 個負號變成正號,減掉最小的數,然後相加其它數。

(2)當既有正數又有負數,那麼可以通過轉換變成所有數的絕對值相加。

例:輸入2 4

-1 -2 -3 4 5 6 7

可以這樣組合:4-((-3)-7-2)+5+6 -(-1)

3、給定的數字本身中負數的個數大於 m,這種情況下要分兩種小情況進行考慮。

(1)當沒有正數全部為負數時,那麼減去乙個絕對值最小的數,其他數字絕對值相加。

例: 輸入 : 1 2

-2 -3 -1 -5

可以這樣組合: (-1) - (-5)-((-3)+(-2))

(2)當存在正數和負數時,那麼所有數字的絕對值相加。

比如(6 5 -4 -3 -2 -1),有1個減號,那麼可以變成 6 + 5 - ( -4 + -3 + -2 + -1 )

;有2個減號,那麼可以變成 6 + 5 - -4 - ( -3 + -2 + -1 ) ;有3個減號,那麼可以變成6 + 5 - -4 -

-3 - ( -2 + -1 )

(3)當負號 m = 0 時,那麼只能所有數相加了。

#include

#include

using

namespace std;

#define maxn 200005

int a[maxn]

;int

main()

sort

(a, a + n + m +1)

;for

(int i =

0; i < n + m +

1; i++)}

if(a[n + m]

<=0)

item = m + n +1;

if(item >= m && m >0)

for(

int i =

0; i < item; i++)}

else

else

m = m - item;

n = n + item;

}for

(int i =

0; i < n + m +

1; i++

)printf

("%lld"

, ans)

;return0;

}

字尾表示式 中綴到字尾表示式

輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...

字尾表示式

字尾表示式的計算和中綴表示式轉字尾表示式 此處的運算用的是鍊錶的表示方法 以下為三個會涉及到的標頭檔案 error.h 字尾表示式 created by kyle.yang on 14 12 2.ifndef error h define error h include using namespac...

字尾表示式

對於乙個算術表示式我們的一般寫法是這樣的 3 4 5 6 這中寫法是中序表示式 而後序表示式則是將運算子放在運算元的後面,如 3 4 5 6 可以看出後序表示式中沒有括號,只表達了計算的順序,而這個順序恰好就是計算器中的一般計算順序。建立乙個棧s 從左到右讀表示式,如果讀到運算元就將它壓入棧s中,如...