1247. 后缀表达式(贪心C++)acwing蓝桥杯

https://www.acwing.com/problem/content/1249/

目录

题解思路:

AC代码:


给定 N个加号、M 个减号以及 N+M+1 个整数A1,A2,···,AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?

请你输出这个最大的结果。

例如使用 123+−,则 “23+1−” 这个后缀表达式结果是 4,是最大的。

输入格式

第一行包含两个整数 N 和 M。

第二行包含 N+M+1 个整数 A1,A2,⋅⋅⋅,AN+M+1。

输出格式

输出一个整数,代表答案。

数据范围

0≤N,M≤10^5,
−109≤Ai≤10^9。

输入样例:

1 1
1 2 3

输出样例:

4

题解思路:

这道题,开始看的时候我的第一感觉是,先排序,然后用所有的 +号 先把最大的数加起来,然后用 -号  从最小的数开始减,但是这种策略算出来的值并不是最大的。正确思路:1,先判断m==0,如果m==0,把所有数相加即可。2,m!=0 用最大的数减去最小的数,剩下的数     可加可减,为保证最大值,把剩下的数的绝对值相加即可。   这样说,可能有些同学不太明白;比如说4个数 a,b,c,d; 3个 -号 ,写成a-(b-c-d)=a-b+c+d,也就是只需要1个 -号,剩下的 -号 可以转化为 +号。所以就只需要用最大的数 - 最小的数,剩下的 -号 转化为+号,+ 剩下数的绝对值。

AC代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

long long int a[200010];

int main()
{
    int n,m;cin>>n>>m;
    int lens=n+m+1;
    for(int i=0;i<lens;i++)cin>>a[i];
    sort(a,a+lens);//排序
    long long int ans=a[lens-1]-a[0],sum=0; //sum用于m==0情况,ans用于m!=0,先用最大减去最小
    for(int i=1;i<lens-1;i++)ans+=abs(a[i]);//除了最大和最小的其他值,直接加上绝对值
    if(m==0){
    for(int i=0;i<lens;i++)sum+=a[i];
    cout<<sum<<endl;
    }
    else cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52797843/article/details/122429124