蓝桥杯题目---算式最大值

17 篇文章 0 订阅
15 篇文章 0 订阅
描述

给定:

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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值