第十届蓝桥杯c/c++b组 后缀表达式
第十届蓝桥杯c/c++b组 后缀表达式
刚考完第十届蓝桥杯,觉得很不满意,但考过了也没办法,算了……
还是来说说这届的第九题吧(好像是第九题,有点忘了……)
这道题的标题是后缀表达式。
题目大意说是给n个加号,m个减号,然后再给出n + m + 1个整数,然后就可以组成很多种形式的后缀表达式,求出最大的后缀表达式对应的数值。
比如给出一个加号,一个减号,再给出三个数分别为3, 5, – 1,则当后缀表达式为35+(-1)-时,其值最大,为3 + 5 – (-1)= 9;所以输出9(不知道题意是不是这样,不知道会不会是我看错了。。。。。。。。。考完试严重怀疑自己,权当题意就是如上所述吧)
思路:
一开始我的思路是暴力枚举所有后缀表达式,然后求后缀表达式的值,最后再得出最大的值。但是想了想,这样实现起来不仅有点困难,而且复杂度也挺高。
于是我换了个思路:既然我们是求最大值,那为什么一定要用后缀表达式求呢?可不可以考虑以下思路:
为了使得表达式值最大,那么在加一个数时我加上当前最大的数,在减一个数时减去当前最小的数不就可以了吗?(不知道思路对不对,仅仅是作为考完试的总结)
所以,代码如下:
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; int num[100005]; int main() { int n, m; //n个加号, m个减号 cin >> n >> m; int count = m + n + 1; //整数个数 for(int i = 0; i < count; i++) { cin >> num[i]; } sort(num, num + count); int sum = num[count - 1]; int curr = count - 2; for(int i = 0; i < n; i++) { sum += num[curr--]; //尽量加上尽可能大的数 } curr = 0; for(int i = 0; i < m; i++) { sum -= num[curr++]; //尽量减去尽可能小的数 } cout << sum << endl; return 0; }
我不知道这种思路是否严谨,也不知道我上述的实现是否正确,但是,至少能过一部分样例吧(哪怕过一丢丢应该是可以的)。(也许是我脑抽,也许这道题不会像我想象中这么简单,但是现在头真的很晕,考完试就是这样)
如果有问题,欢迎提出,我要去面壁思过了。