2019藍橋杯初賽 后綴表達式


http://oj.ecustacm.cn/problem.php?id=1467

 

藍橋賽前練練手~~

 

后綴表達式可以模擬任意加括號的結果

所以相當於給出n個加號,m個減號,n+m+1個數,用這些任意組成一個式子,使結果最大

用大寫字母表示正數,小寫字母表示負數

最優的情況是n+m+1個數中,有n+1個正數,有m個非正數

即構成A+B+C+D-a-b-c形式

結果就是絕對值之和

 

在此基礎上

如果減號多了,說明需要給正數前分配減號

1、如果有非正數,那么可以構成A-(a-B)=A-a+B,依然是絕對值之和

2、如果全是正數,那么可以構成A-(B-C)=A-B+C,顯然需要B最小,結果就是絕對值之和-2*最小正數

如果加號多了,說明需要給負數前分配加號

1、如果沒有減號,那么只能是A+a+b,結果就是所有數的和

2、如果有減號而且有正數,那么可以構成A-(a+b)=A-a-b,結果是絕對值之和

    如果有減號而且沒有正數,a-(b+c)=a-b-c,需要a最大,結果就是絕對值之和+2*最大非正數

 

#include<cstdio>
#include<algorithm>

using namespace std;

#define N 100001 

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int tot=n+m+1,x,s1=0,s2=0;
    long long sa=0,sb=0;
    int mi=1e9;
    for(int i=1;i<=tot;++i) 
    {
        scanf("%d",&x);
        if(x>0) s1++,sa+=x;
        else s2++,sb-=x;
        mi=min(mi,abs(x));
    }
    if(m==s2) printf("%lld",sa+sb);
    else if(m>s2)
    {
        if(s2) printf("%lld",sa+sb);
        else printf("%lld",sa+sb-2*mi);
    }
    else
    {
        if(m) 
        {
            if(s1) printf("%lld",sa+sb);
            else printf("%lld",sb-2*mi);
        }
        else printf("%lld",sa-sb);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM