【蓝桥杯考前突击】第十届蓝桥杯省赛C/C++大学B组 试题 I 后缀表达式

  给定 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;
} 

有问题可以留言交流٩(๑❛ᴗ❛๑)۶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞烟火~

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值