提示:未通过全部数据,思路仅供参考,后续要记得完善
题目描述
输入输出样例
输入
1 1
1 2 3
输出
4
思路
- 分情况讨论,合并相同计算情况的方法,可以分四种,如下图所示
- 从上图看出分两种情况即可:只有+;剩余所有情况
- 举例说明上述第二种情况:
- 输入数据全部为正数,符号只有-: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)
- 从例子中可以看出最大表达式出自:最大值-最小值+剩余值的绝对值,这个思路是我看了博客,在套用例子得出的
- 思路很乱,还是有点不太理解原因,但是用例子就能理解一点
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;
}