蓝桥杯后缀表达式(C语言解法)

提示:未通过全部数据,思路仅供参考,后续要记得完善

题目描述

蓝桥杯后缀表达式(C语言解法)

输入输出样例

输入

1 1
1 2 3

输出

4

思路

  1. 分情况讨论,合并相同计算情况的方法,可以分四种,如下图所示
    蓝桥杯后缀表达式(C语言解法)
  2. 从上图看出分两种情况即可:只有+;剩余所有情况
  3. 举例说明上述第二种情况:
  • 输入数据全部为正数,符号只有-:1 2 3 得到最大值的表达式为:2-(1-3)=>2-1+3 =>3-1+2
  • 输入数据全部为正数,符号有+有-:1 2 3 4,1个+,2个-,最大值:4-(1-3)+2 =》4-1+3+2
  • 输入数据全部为负数,符号只有-:-1 -2 -3,最大值:-1-(-2)-(-3)=>-1+2+3=>-1-(-3)+2
  • 输入数据全部为负数,符号有+有-:-1 -2 -3 -4,2个+,1个-:-1-[-2+(-3)+(-4)]=>-1+2+3+4
  • 输入数据有正有负,符号只有-:-3 -2 3 4:4-(-3)-(-2-3)
  • 输入数据有正有负,符号有+有-:-3 -2 3 4,1个+,2个-:4+3-(-2)-(-3)
  • 从例子中可以看出最大表达式出自:最大值-最小值+剩余值的绝对值,这个思路是我看了博客,在套用例子得出的
  1. 思路很乱,还是有点不太理解原因,但是用例子就能理解一点
int main(){
	int i,_max,_min;//记录下标
	long int _zcount,_fcount,length,fs=0,zs=0,sum=0,max=0,min=9999;
	long int num[300000];
	scanf("%ld %ld",&_zcount,&_fcount);
	length=_zcount+_fcount+1;
	for(i=0;i<length;i++){
		scanf("%ld",&num[i]);
		if(num[i]<0)fs+=1;//read data;
		else zs++;
		if(max<num[i]){max=num[i];_max=i;}
		if(min>num[i]){min=num[i];_min=i;}//读入数据,并记录最大最小值及下标
	}
	if(_fcount==0){//全部为+情况
		sum=num[length-1];
		for(i=length-1;i>0;i--){
			sum+=num[i-1];
		}
	}
	else{//余下情况
			sum=max-min;
			for(i=1;i<=length-2 && i!=_max && i!=_min;i++){
				if(num[i]<0)sum+=-num[i];
				else sum+=num[i]; 
			}
	}
	printf("%ld",sum);
	return 0;
}
上一篇:【reverse】逆向2 寄存器与内存


下一篇:PAT乙级 1008 数组元素循环右移问题 (20 分)