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); } }