首页 > 其他分享 >后缀表达式

后缀表达式

时间:2024-02-26 22:34:59浏览次数:25  
标签:ch 符号 后缀 括号 int 减号 表达式

一、题目描述

P8683 [蓝桥杯 2019 省 B] 后缀表达式

二、算法简析

显然,这道题要用贪心思想。想当然的,我们会先进行降序排序,将大的相加,在减去小的。然而,这种想法是错误的。因为这道题要求的是后缀表达式的最大值,为了便于理解,我们转换为中缀表达式的最大值,这里就有了一个隐含条件——中缀表达式可以加括号。
有了括号的加入,情况就变得复杂了。但并不总是如此。

  • 1、当 \(M==0\) 时,即没有减号。
    这时,无论我们怎样加括号,都是加法运算,也就是所有元素相加。
  • 2、当 \(M > 0\) 时,即存在减号,至少有一个减号。
    首先,我们知道数有 \(N + M + 1\) 个、符号有 \(N + M\) 个,所以两个数之间一定有一个符号。假设组合形式为 符号 + ,显然有 \(N+M\) 对,有一个数没有符号(相当于加号)。谁来当这个没有符号的数呢?从贪心的角度,应该选最大的数(毕竟相当于前面为加号),记为 max
    由于减号的存在,必然有一个数要被减去。我们当然希望这个数要小,所以选最小的数,记为 min
    我们将式子写成如下形式:max _{} _{} ... - (min _{} _{} ...)
    _即符号,{}为数。我们发现:对于一个数 \(a\),如果我们想上它,可以与 + 组合放在括号外,也可以与 - 组合放在括号内(括号前为 -,负负得正);如果想去它,可以与 + 组合放在括号内,也可以与 - 组合放在括号外。
    这有什么用呢?先考虑符号无限多的情况,为了得到最大值,我们肯定加正数减负数,相当于加一个数的绝对值。利用上面的发现,在 +- 的数量有限时,无论一个数与哪个符号组合,只要调整这个组合的位置,就可以达到我们想要的加减状态——加上剩余数的绝对值。
    注意,只要有一个减号,我们就能达到上述目的。

总结
1、当 \(M==0\) 时,所有元素相加。
2、当 \(M > 0\) 时, max min,再加上剩余数的绝对值。


三、本题代码

#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

int N, M;
vector<int> A;

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	N = quickin(), M = quickin();
	
	for (int i = 0; i < N + M + 1; i++)
	{
		int a = quickin();
		A.push_back(a);
	}
	
	sort(A.begin(), A.end());
	
	ull ans = 0;
	if (M > 0)
	{
		ans += A[A.size() - 1];
		ans -= A[0];
		for (int i = 1; i < A.size() - 1; i++)
			ans += abs(A[i]);
	}
	else
		for (int i = 0; i < A.size(); i++)
			ans += A[i];
	
	cout << ans << endl;
	
	return 0;	
} 

标签:ch,符号,后缀,括号,int,减号,表达式
From: https://www.cnblogs.com/hoyd/p/18035735

相关文章

  • 正则表达式拾遗
    正则表达式拾遗正则介绍正则表达式,又称规则表达式,(RegularExpression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”),是计算机科学的一个概念。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符......
  • springBoot 整合 groovy 实现表达式解析 该示例可以用于配置告警规则
    1.引入pom<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version></dependency><dependency......
  • 后缀数组学习笔记 应用篇
    一些后缀数组的应用。利用\(sa\)和\(rk\)数组这类题目通常需要发掘一些性质,转化为求串的字典序最小/大后缀或长度固定的子串。P3809【模板】后缀排序后缀数组板子。P6095[JSOI2015]串分割二分答案串的排名。CF1923FShrink-Reverse转化为求长度为\(len\)的字典......
  • 正则表达式
    匹配单个英文字母匹配区间[0-9a-zA-Z]不用逗号!!匹配特殊字符匹配非集快捷方式\d匹配全数字\w匹配数字、字母和下划线\s匹配空格tab换行\bxxx\b匹配单词边界(注意不要加中括号,不加中括号指xxx作为一体,加中括号表示可拆成字母分别匹配)以上所有快......
  • 正则表达式
     介绍:一个简单的Java正则工具类,其中包含了对用户名和密码的正则表达式。 要求:用户名的正则表达式:4至8位,只能为单独的英文或中文(中文的话为四位)。密码的正则表达式:6至12位,包含字母、数字、特殊字符。publicclassRegexUtil{//用户名的正则表......
  • 刘铁猛C#学习笔记9 表达式、语句2
    1.循环语句C#中有四种循环while循环,do-while循环,for计数循环,foreach遍历循环(1)while循环while()括号内写循环条件,一个bool类型表达式之后写一个嵌入式语句作为循环体 (2)do-while循环先执行一次,在判断循环条件,所以循环体至少会执行一次do{循环体}while(循环条件......
  • 刘铁猛C#学习笔记8 表达式、语句1
    表达式1.表达式的定义通用定义:一种专门用来求值的语法实体C#中定义:由一个或多个操作数,零个或多个操作符,功能是求值,求值的结果可能是四类Singlevalue、object、method、namespace(说明至少要有一个操作数,但不一定要有操作符)  C#中表达式值的类型:(1)单值Singlevalue......
  • idea正则表达式ctrl+R替换
    正则表达式进行查找替换在idea上ctrl+F查找时,可以用类似label="(.*?)"来匹配所有label和其等于的值:注意得选中后面的".*"这是一个正则表达式的匹配:(.*?)用一对括号捕获组——捕获组可以提取双引号中的实际值.匹配任何字符,*出现任意次数,?表示......
  • 后缀数组
    虽然这是基础算法,但我已经好几次忘记它怎么写了,反倒是SAM记得很牢。为了避免比赛中因这个爆蛋,我打算仔细梳理一下它的原理。问题:给你一个字符串,你需要求出\(sa_i,rk_i\),其中\(sa_i\)表示排名为\(i\)的后缀,\(rk_i\)表示后缀\(i\)的排名。首先暴力就是直接快排,里面......
  • python正则表达式之
    1.Match从字符串起始位置开始匹配,两个参数(正则表达式,字符串).*代表匹配前面的字符无限次content='Hello1234567World_ThisisaRegexDemo'#通用匹配result=re.match('^Hello.*Demo$',content)print(result)print(result.group())print(result.span())贪婪......