给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1, A2, · · · , AN+M+1,小
明想知道在所有由这 N 个加号、M 个减号以及 N + M + 1 个整数凑出的合法的
后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
说实话
第一眼看到真不会写
本代码参考自亓官劼
仅供参考 我也不会啊 照着瞎写的
简单查了下后缀表达式
意思就是说
遇到数字就压栈,遇到符号就弹出栈顶两个元素
并运算
将运算结果压栈
然后继续以上步骤。。。遇到数字就压栈.....
这个题,博主亓官劼表达的很清楚,正数的话,尽量让大的加,必要的时候,小的减。负数的话,尽量让绝对值大的减,必要的时候,绝对值小的减。
或者换句话说,加的时候优先加最大的正数,减的时候优先减最小的负数,从而保证最后和最大
我下面的代码也是采用此思想
主要关注点,就是实现我上面那句最长的话
还是那句话 我不会写 代码仅供参考 并未使用大数测试
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
long long a[200005];//存放正数
long long b[200005];//存放负数
int main(){
int N,M;
cin>>N>>M;
int m=1;
int n=1;
for(int i=1;i<=N+M+1;i++){
long long c;
cin>>c;
if(c>0){
a[m++]=c;
}else{
b[n++]=c;
}
}
int lena=m-1;
int lenb=n-1;
long long sum=0;
sort(a+1,a+lena+1,greater<int>());//由大到小排序
sort(b+1,b+lenb+1,greater<int>());
for(int i=1;i<=N+M+1;i++){
if(i<=N+1){
if(i<=lena){
sum+=a[i];
}else{
sum+=b[i-lena];
}
}else{
if(i<=lena){
sum-=a[i];
}else{
sum-=b[i-lena];
}
}
}
cout<<sum<<endl;
return 0;
}
有问题可以留言交流٩(๑❛ᴗ❛๑)۶