描述
给定:
1)N个正整数A1, A2, ... AN;
2)P个加号+和Q个减号-; (P+Q=N-1)
3)K对括号()
请你使用全部整数、加减号和括号,组成一个合法的算式(A1~AN在算式中的顺序随意),使得算式的结果最大。
注意加减号只能作为二元运算符出现在算式中,不能作为正负号。
括号可以出现在算式最左和最右,例如(((1+2)))是合法的。
例如对于样例数据,(2-1)+3或3+(2-1)等都是结果最大的算式。
输入
第一行包含4个整数,N,P, Q和K。
第二行包含N个整数A1, A2, ... AN。
2 ≤ N ≤ 100 P+Q+1=N 0 ≤ K ≤ 10
1 ≤ Ai ≤ 1000
输出
最大算式结果
样例输入
3 1 1 1
1 2 3
样例输出
4
这道题很简单,没考算法,就是看你能不能发现一种贪心策略,由题目可知符号只有加减,那么就该考虑是否存在一种做法,让减号全部被消去比如 1-(-2-3-4),但题目说,所以直接pass掉,那么这道题就可以换成另一种思路,如果存在括号就让减号尽力少,那么就可以这样1-(2-3-4)=1-2+3+4,就变成一个减号了,显然只有一个减号时,就是最大和(前面已经讨论过减号不能全部消去),则这道题思路:
代码:
#include <vector>
#include <stack>
#include <string>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <queue>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define _unfor(i,a,b) for(int i=a;i>=b;i--)
#define RI(a) scanf("%d",&a)
#define mset(a,val,n) for(int i=0;i<n;i++)a[i]=val;
#define mset2(a,val,n,m) for(int i=0;i<n;i++)for(int j=0;j<m;j++)a[i][j]=val;
#define FI freopen("in.txt","r",stdin)
#define FO freopen("out.txt","w",stdout)
using namespace std;
int n,p,q,k,a[111],sum=0,subsum=0;
int main() {
cin>>n>>p>>q>>k;
_for(i,0,n)scanf("%d",&a[i]);
_for(i,0,n)sum+=a[i];
sort(a,a+n);
_for(i,0,q)subsum+=a[i];
if(q)sum-=k?(a[0]*2):subsum;
cout<<sum<<endl;
}