陽后第5天,基本康復,回歸正常作息。
1247. 后綴表達式 - AcWing題庫
給定?NN?個加號、MM?個減號以及?N+M+1N+M+1?個整數?A1,A2,???,AN+M+1A1,A2,···,AN+M+1,小明想知道在所有由這?NN?個加號、MM?個減號以及?N+M+1N+M+1?個整數湊出的合法的后綴表達式中,結果大的是哪一個?
請你輸出這個大的結果。
例如使用?123+?123+?,則?“23+1?”“23+1?”?這個后綴表達式結果是?44,是大的。
輸入格式
第一行包含兩個整數?NN?和?MM。
第二行包含?N+M+1N+M+1?個整數?A1,A2,???,AN+M+1A1,A2,···,AN+M+1。
輸出格式
輸出一個整數,代表答案。
數據范圍
0≤N,M≤1050≤N,M≤105,
?109≤Ai≤109?109≤Ai≤109
輸入樣例:
1 1
1 2 3
輸出樣例:
4
這道貪心題其實我一開始的想法是這樣的:n個+,m個 - ,那就用大的數作為基數,降序排序后加上前n個,減去后m個即可。可是想法還是太簡單了wrong answer。看了題解以后才明白過來:根據后綴表達式的特性,顯然我們可以將多個 - 變成一個 - 和多個+(將后綴表達式表示成二叉樹更好理解一些,可以參考其他佬寫的這篇文章二叉樹應用——后綴表達式構建表達式樹_趙同學的博客-博客_后綴表達式轉二叉樹)
題目要求求出后綴表達式的大值,因此,當m為0時,直接加和即可;m不為0時,ans = f[max] - f[min],ans += abs(f[i])即可。
#include#include
#includeusing namespace std;
typedef long long LL;
const int N = 2e5+10;
int f[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<=n+m;i++) scanf("%d",&f[i]);
LL ans = 0;
if(!m) {
for(int i=0;i<=n+m;i++) ans+=f[i];
} else{
sort(f,f+n+m+1,greater());
ans = f[0] - f[n+m];
for(int i=1;i你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
新聞名稱:題:后綴表達式-創新互聯
標題網址:http://www.2m8n56k.cn/article26/gjjcg.html
成都網站建設公司_創新互聯,為您提供外貿建站、網站制作、網站設計、做網站、企業建站、自適應網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源:
創新互聯