[Lanqiao Cup pre-exam assault] The 10th Lanqiao Cup Provincial C/C++ University Group B Test Questions I Suffix Expression

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

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

Guess you like

Origin blog.csdn.net/kieson_uabc/article/details/109012793