P8683 [蓝桥杯 2019 省 B] 后缀表达式 题解
1. 编程思路。
题目给出了后缀表达式中加号的个数为
要使后缀表达式的值最大,分以下四种情况讨论。
1)
2)有减号,但全部的数均为正数,即
如果只有
如果有多个减号,我们可以让最小的正数连续减去
3)有减号,但全部的数均为负数,即
如果只有
如果有多个减号,我们可以让最大的负数连续减去
4)有减号,并且也有正数,也有负数。此时处理起来简单。用减号减去负数即可。
如果负数个数比减号多,可以采用
如果负数的个数比减号少,可以采用
总之,最后结果一定是所有正数和负数的绝对值相加,后缀表达式的值也最大,为
2. 源程序。
#include <stdio.h>
int main()
{
int n,m,p=0,q=0;
scanf("%d%d",&n,&m);
long long psum=0,nsum=0;
long long pmin=2000000000,nmax=-2000000000;
int i;
for (i=0;i<n+m+1;i++)
{
long long num;
scanf("%lld",&num);
if (num>0ll)
{
p++;
psum+=num;
if (pmin>num) pmin=num;
}
else
{
q++; nsum+=num;
if (nmax<num) nmax=num;
}
}
if (m==0) // 负号个数为0
printf("%lld\n",psum+nsum);
else
{
if (p==n+m+1) // 全部为正数
printf("%lld\n",psum-2*pmin);
else if (q==n+m+1) // 全部为负数
printf("%lld\n",-nsum+2*nmax);
else
printf("%lld\n",psum-nsum);
}
return 0;
}