精华内容
下载资源
问答
  • 蓝桥杯后缀表达式

    2020-02-03 16:32:59
    蓝桥杯后缀表达式 【问题描述】 给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1,A2,··· ,AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一...

    蓝桥杯后缀表达式

    【问题描述】

    给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1,A2,··· ,AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个?
    请你输出这个最大的结果。 例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
    时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分

    【输入格式】

    第一行包含两个整数 N 和 M。
    第二行包含 N + M + 1 个整数 A1,A2,··· ,AN+M+1

    【输出格式】

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

    解题思路:

    1. 获得并存储数据
    2. 对数据进行全排
    3. 去重操作(使用Set集合可以去重)
    4. 对全排的数组进行整合
    5. 获得结果

    输入样例:

    2 3
    1 2 3 4 5 6
    

    结果:

    9
    

    java完整代码:

    package demo.yrs;
    
    import java.util.HashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    public class SuffixExpression{
    	
    	/* 后缀表达式 */
    	/* Set集合用来存储 全排后的 数据 */
    	//数据可能出现的情况
    	static Set<int[]> setArr = new HashSet<>();
    	//运算符可能出现的情况
    	static Set<char[]> setArr1 = new HashSet<>();
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int resultMax= 0;
    		int n = sc.nextInt();
    		int m = sc.nextInt();
    		int [] nums = new int[n+m+1];
    		char [] marks = new char[n+m];
    		for (int i = 0; i < n; i++) {
    			marks[i] = '+';
    		}
    		for (int i = n; i < n+m; i++) {
    			marks[i] = '-';
    		}
    		for (int i = 0; i < nums.length; i++) {
    			nums[i]=sc.nextInt();
    		}
    		sc.close();
    		/* 全排数字 */
    		allSort(nums, 0, nums.length);
    		/* 全排运算符 */
    		allSortChar(marks, 0, marks.length);
    		
    		/* 遍历符号集合 符号出现的所有可能 */
    		for (char[] d : setArr1) {
    				/* 遍历数字集合 */
    				for (int[] c : setArr) {
    				//对每种数据和运算符进行  组合
    					int max = 0;
    					//数值求和  c.length-1 是因为 每次操作都是操作后一个数据,到了最后一个数据不用进行操作
    					for (int i = 0; i < c.length-1; i++) {
    						if(i ==0 ) {
    							max+=c[i];
    						}
    						if(d[i] == '+') {
    							max+=c[i+1];
    						}
    						if(d[i] == '-'){
    							max-=c[i+1];
    						}		
    					}
    					
    					if(max>resultMax) {
    						resultMax = max;
    					}
    				}
    		}
    		System.out.println(resultMax);
    		
    	}
    	public static void swap(int [] nums,int i,int j) {
    		int temp = nums[i];
    		nums[i] = nums[j];
    		nums[j] =temp;
    	}
    	public static void allSort(int [] nums,int start,int end) {
    		if(start == end) {
    			int[] a = new int[nums.length];
    			for (int i = 0; i < nums.length; i++) {
    				a[i] =nums[i];
    			}
    			setArr.add(a);
    		}else {
    			for (int i = start; i < end; i++) {
    				swap(nums,i,start);
    				allSort(nums,start+1,end);
    				swap(nums,start,i);
    			}
    		}
    	}
    	public static void swapChar(char [] nums,int i,int j) {
    		char temp = nums[i];
    		nums[i] = nums[j];
    		nums[j] =temp;
    	}
    	public static void allSortChar(char [] nums,int start,int end) {
    		if(start == end) {
    			char[] a = new char[nums.length];
    			for (int i = 0; i < nums.length; i++) {
    				a[i] =nums[i];
    			}
    			setArr1.add(a);
    		}else {
    			for (int i = start; i < end; i++) {
    				swapChar(nums,i,start);
    				allSortChar(nums,start+1,end);
    				swapChar(nums,start,i);
    			}
    		}
    	}
    }
    
    
    展开全文
  • 蓝桥杯 后缀表达式解析

    千次阅读 多人点赞 2020-01-30 17:54:28
    蓝桥杯 后缀表达式解析后缀表达式问题问题描述输入问题分析源代码 后缀表达式 第十届蓝桥杯后缀表达式题目是一个比较有意思的题。 可以说和后缀表达式的相关知识关联很小,更多的是分情况讨论分析。 问题 问题描述...

    后缀表达式

    第十届蓝桥杯的后缀表达式题目是一个比较有意思的题。
    可以说和后缀表达式的相关知识关联很小,更多的是分情况讨论分析

    问题

    问题描述

    给定N 个加号、M 个减号以及N + M + 1 个整数A1,A2,…,AN+M+1
    小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
    请你输出这个最大的结果。
    例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。

    输入

    第一行包含两个整数N 和M。
    第二行包含N + M + 1 个整数A1,A2,…,AN+M+1
    0<=N,M<=100000,-10^9 <= Ai <= 10^9

    题目链接: http://oj.ecustacm.cn/problem.php?id=1467.

    问题分析

    可分为三种情况:

    1. 负数与负号数量相同 :所有数的绝对值相加
      0n1ai\sum_0^{n-1} \vert a_i \vert
    2. 负数多于负号数 :一般情况与第1种情况结果相同,比如1-(-1+(-2))-(-1).
      特殊情况如下:
      2.1 当全为负数时, 0n1ai+2maxaiai<0\sum_0^{n-1} \vert a_i \vert +2\max a_i\vert _{a_i<0}
      2.2 当负号数量为0时, 0n1ai\sum_0^{n-1} a_i
    3. 负数少于负号数 :一般情况与第1种情况结果相同,比如1-((-1)-2).
      特殊情况如下:
      当没有负数时, 0n1ai+2minaiai0\sum_0^{n-1} \vert a_i \vert +2\min a_i\vert _{a_i\geq0}

    源代码

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
     
    typedef long long ll;
     
    int n,m,N;
     
    int main()
    {
        scanf("%d%d",&n,&m);
        N=n+m+1;
        int minz=1e9+1,maxf=-1e9-1;
        int numz=0,numf=0;
        int tmp;
        ll sumnum=0,sumn=0;
        for(int i=0;i<N;i++)
        {
            scanf("%d",&tmp);
            sumnum+=abs(tmp);
            sumn+=tmp;
            if(tmp<0)
            {
                numf++;
                maxf=max(maxf,tmp);
            }
            else
            {
                numz++;
                minz=min(minz,tmp);
            }
        }
        //cout<<numz<<' '<<numf<<endl;
        //cout<<minz<<' '<<maxf<<endl;
        if(numf==m)
            cout<<sumnum<<endl;
        else if(m==0)
            cout<<sumn<<endl;
        else if(numf>m)
        {
            if(numz==0)
                cout<<sumnum+2*maxf<<endl;
            else
                cout<<sumnum<<endl;
        }
        else
        {
            if(numf==0)
                cout<<sumnum-2*minz<<endl;
            else
                cout<<sumnum<<endl;
        }
     
        return 0;
    }
    
    展开全文
  • 蓝桥杯 后缀表达式

    2020-10-18 00:01:11
    后缀表达式中,结果最大的是哪一个? 请你输出这个最大的结果。 例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。 【输入格式】 第一行包含两个整数 N 和 M。 第二行包含 N + M + 1 个整数 ...

    【问题描述】

    给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1, A2, ··· , AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的

    后缀表达式中,结果最大的是哪一个?

    请你输出这个最大的结果。
    例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。

    【输入格式】

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

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

    【输出格式】

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

    【样例输入】

    1 1
    1 2 3

    【样例输出】

    4

    程序说明:

    如果是中缀表达式,那么加号就是加,减号就是减。但是后缀表达式可以通过加括号把减号变成加号,因此这道题可以理解为可以任意加括号的中缀表达式。

    如果减号的个数为0,就直接把所有的数相加。如果减号的个数不为0,则最少有一个减号,可以把其他的减号全都放进一个括号里,括号外只保留一个减号。那么就可以转换为只做一次减法。要使后缀表达式值最大,则减去的那个数应该最小。

    注意数据有负数,应该加上绝对值。另外不允许减号前面没有数字,例如-(1-2-3),所以要用最大数减去最小数,再把其他数的绝对值加上。第一次做的时候没有考虑到这一点,把最小数之后的所有数先加上,最后再减去最小数,如果数据全是负数的话就错了,相当于在括号外只加了一个负号,这种情况是不允许的。

    代码如下:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long LL;
    const int N = 200100;
    LL a[N], res;
    int main() {
        int n, m;
        cin>>n>>m;
        int k = n + m + 1;
        
        for(int i = 0; i < k; i++)
            cin>>a[i];
    
        if(!m) {
            for(int i = 0; i < k; i++)
                res += a[i];
        }
        else {
            sort(a, a + k);
            res = a[k - 1] - a[0];
            for(int i = 1; i < k - 1; i++)
                res += abs(a[i]);
        }
        cout<<res<<endl;
        return 0;
    }
    
    展开全文
  • 后缀表达式 题目描述 给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1, A2, · · · , AN+M+1,小 明想知道在所有由这 N 个加号、M 个减号以及 N + M + 1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个? ...

    后缀表达式

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

    请你输出这个最大的结果。
    例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。

    输入

    第一行包含两个整数 N 和 M。
    第二行包含 N + M + 1 个整数 A1, A2, · · · , AN+M+1。

    (对于所有评测用例,0≤ N,M ≤100000,−109 ≤ Ai ≤109。)

    输出

    输出一个数,表示答案

    样例输入

    1 1
    1 2 3

    样例输出
    4

    代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    long long a[200010];
    int main()
    {
        int n,m;
        scanf("%d %d",&n,&m);// n+  m-
        int l=n+m+1;
        for(int i=1; i<=l; i++)
            scanf("%lld",&a[i]);
        long long f=0,s=0;
        for(int i=1; i<=l; i++)
        {
            if(a[i]<0)
                f++;
            s+=a[i];
        }
        sort(a+1,a+1+l);
        if(m)
        {
            if(f)//如果有负数
            {
                if(f==l) //全是负数
                {
                    for(int i=1; i<l; i++)
                        s-=2*a[i];
                }
                else//不全是负数
                {
                    for(int i=1; i<=f; i++)
                        s-=2*a[i];
                }
            }
            else//没有负数
            {
                s-=2*a[1];
            }
        }
        printf("%lld\n",s);
        return 0;
    }
    
    展开全文
  • 即一般的后缀表达式23+1-其实是((2+3)-1) 简单来说题目有两种情况 没有负号的情况这个情况最简单,直接全部加起来就行了 有负号的情况这个时候我们需要想想,给你一串数字,怎么减才能得到最大的值呢?很简单,...
  • 蓝桥杯后缀表达式

    2021-04-14 19:00:38
    蓝桥杯后缀表达式 标题题解: 由于后缀表达式的特性,如果没有一个减号,那么结果就是全部数相加; 如果减号个数很多时,其必然能有足够的减号将负数变成正数,因此其在使用后会剩余若干个减号,而剩余的若干减号...
  • 原题链接:后缀表达式 题目描述 给定 NNN 个加号、MMM 个减号以及 N+M+1N+M+1N+M+1 个整数 A1,A2,⋅⋅⋅,AN+M+1,A_1,A_2,⋅⋅⋅,A_{N+M+1},A1​,A2​,⋅⋅⋅,AN+M+1​,小明想知道在所有由这 NNN 个加号、MMM 个...
  • 蓝桥杯-后缀表达式

    2021-03-27 18:20:42
    这道题题面虽然提及后缀表达式的概念,但是只要你明白后缀表达式就是中缀表达式的添加括号的另一种表达方式,所以这道题的坑点有二:1.数据范围要注意,还有一点就是负号的在加上括号后的作用范围会扩大; 2.分析 这...
  • 小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个? 请你输出这个最大的结果。 例如使用 123+−,则 “23+1−” 这个后缀表达式结果是 4,是最大的。 ...
  • 将中缀表达式转化为后缀表达式,完成表达式求值。 这里采用辅助栈的方法,将中缀表达式转化为后缀表达式: 给操作符设置优先级: map<char,int>mp; mp['#']=-1; mp['(']=mp[')']=0; mp['+']=mp['-']=1...
  • 蓝桥杯后缀表达式(Java实现) 题目信息 【题目描述】 给定N 个加号、M 个减号以及N + M + 1 个整数A1,A2,…,AN+M+1 小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果...
  • 给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1,A2,··· ,AN+M+1,小 明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个? 请你输出这个最大的结果。 ...
  • 蓝桥杯_表达式计算

    2017-04-20 09:15:00
    这道题的关键是中缀表达式转后缀表达式。 定义一个符号栈和一个数字栈。怎么中缀转后缀,数据结构这本书上有。 这里简单说一下,从左往右扫描字符串,遇见数字就压入数字栈。 遇见符号的话, 1、如果是'(',直接...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 205
精华内容 82
关键字:

蓝桥杯后缀表达式