P8683题解
MTF_Lambda_04 · · 题解
首先,看题目描述,给定
这题很容易让人想到贪心。但是呢,又怎么个贪心法呢?很容易看出来,我们可以先用 sort 进行这么一个排序,之后,我们对于前
你以为完了?不!错掉
怎么办呢?我们可以使用 abs 函数消除括号影响。
至于后缀表达式可以参考这篇文章:https://blog.csdn.net/kexuanxiu1163/article/details/90629494
这里解释下为什么用这个函数:首先,请先看完上面推的那篇文章。
之后,我们可以知道的是,在转换后缀为中缀表达式时有一个很烦问题就是有可能有括号,这意味着什么?这意味着加减乘除先后顺序可能改变,同时,题目中给定范围有可能为负数,所以,有可能原本正确的是减去
还是那个例子,你想,我现在减去了
所以,这就是为什么要用这个函数对这些数做这么一个处理的原因。
最后,代码:
#include<bits/stdc++.h>
using namespace std;
long long int n,m,l;
const int N=2*1e6;
long long int a[N];
long long int s=0;
int cmp(int x,int y){
return x>y;
}
int main(){
scanf("%lld%lld",&n,&m);
l=n+m+1;
for(int i=1;i<=l;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+l+1,cmp);
if(m==0){
for(int i=1;i<=l;i++){
s+=a[i];
}
}else{
s=s+a[1];
s=s-a[l];
for(int i=2;i<=l-1;i++){
s=s+abs(a[i]);
}
}
printf("%lld",s);
return 0;
}
抄是会被棕名的!