CSP-CCF★★★201903-2二十四点★★★

目录

一、问题描述

二、解答

方法一:穷举法(只列举了一部分)

方法二:中缀表达式直接求值,两个栈,一个存放数值,一个存放符号

方法三:将中缀表达式转换为后缀来计算注意:

三、总结


一、问题描述

二、解答

方法一:穷举法(只列举了一部分)

即将所有的情况列举出来,共4*4*4=64种情况,但是我实在列不下去了,就只列举了12种。

建造了一个结构体,里面存放输入的字符串;使用两个vector容器,分别存放数字和符号;另外还弄了一个字符串数组,来存放每行结果yes或no。

注意:string不需要显式初始化,且字符串应该使用双引号。

代码(没有写完):

#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct Data {string s;
}str[100];
int main()
{int n;cin >> n;//string str[100];for (int i = 0; i <n; i++){//string s;cin >> str[i].s;}vector<int>a;int m=0;vector<char>b;//string stri[100] = { NULL };string stri[100];//string不需要显式初始化for (int i = 0; i < n; i++){a.clear();//先对vector容器进行清空b.clear();int sum = 0;for (int j = 0; j <= 6; j++)//字符串一共7个,所以j是小于等于6或者小于7,别再犯低级错误了!!!{if (j % 2 == 0){m = str[i].s[j] - '0';a.push_back(m);}else {b.push_back(str[i].s[j]);}	}//共4*4*4=64种情况,实在列不下去了,就列举了12种if (b[0] == '+' && b[1] == '+' && b[2] == '+') {sum = a[0] + a[1] + a[2] + a[3];}if (b[0] == '+' && b[1] == '+' && b[2] == '-') {sum = a[0] + a[1] + a[2] -a[3];}if (b[0] == '+' && b[1] == '+' && b[2] == 'x') {sum = a[0] + a[1] + a[2] *a[3];}if (b[0] == '+' && b[1] == '+' && b[2] == '/') {sum = a[0] + a[1] + a[2] / a[3];}if (b[0] == '+' && b[1] == '-' && b[2] == '+') {sum = a[0] + a[1] - a[2] + a[3];}if (b[0] == '+' && b[1] == '-' && b[2] == '-') {sum = a[0] + a[1] - a[2] - a[3];}if (b[0] == '+' && b[1] == '-' && b[2] == 'x') {sum = a[0] + a[1] - a[2] * a[3];}if (b[0] == '+' && b[1] == '-' && b[2] == '/') {sum = a[0] + a[1] - a[2] / a[3];}if (b[0] == '+' && b[1] == 'x' && b[2] == '+') {sum = a[0] + a[1] * a[2] + a[3];}if (b[0] == '+' && b[1] == 'x' && b[2] == '-') {sum = a[0] + a[1] * a[2] - a[3];}if (b[0] == '+' && b[1] == 'x' && b[2] == 'x') {sum = a[0] + a[1] * a[2] * a[3];}if (b[0] == '+' && b[1] == 'x' && b[2] == '/') {sum = a[0] + a[1] * a[2] / a[3];}if (sum == 24){//stri[i] = 'Yes';stri[i] = "Yes";}else {//stri[i] = 'No';stri[i] = "No";}}for (int i = 0; i < n; i++) {cout << stri[i] << endl;}return 0;
}

方法二:中缀表达式直接求值,两个栈,一个存放数值,一个存放符号

思路可以参考之前写过的博客:栈的应用之表达式求值(前缀、中缀、后缀)-CSDN博客

注意:

①循环条件:栈外元素比栈顶元素优先级小或相等+栈不为空,两个条件才能继续循环

②关于报错:back() called on empty deque:应该先检查栈是否为空,再写其他条件

✘while (pri(s[j]) <= pri(top)||optr.empty()==true)
循环条件是:栈外元素比栈顶元素优先级小或相等+栈不为空,两个条件才能继续循环,所以不应该是||,而是&&。
✘while (pri(s[j]) <= pri(optr.top())&&!optr.empty())
后判空,也是错误的。应该先判空!!!    
✔while (!optr.empty()&&pri(s[j]) <= pri(optr.top()))        

③这里栈不清空不影响,因为只要是看运算符的栈,每次循环结束后,这个栈都是空的。

代码:

#include<iostream>
#include<stack>
using namespace std;
int pri(char op) {//设置优先级if (op == 'x' || op == '/') {return 2;}else if (op == '+' || op == '-') {return 1;}
}
int comp(char op, int x, int y) {//计算switch (op){case '+':return x + y; break;case '-':return x - y; break;case 'x':return x * y; break;case '/':return x / y; break;default:break;}
}
int main()
{int n;cin >> n;string s;stack<int>opnd;//存放数字stack<char>optr;//存放符号string str[100];//存放结果for (int i = 0; i < n; i++){cin >> s;int res = 0;for (int j = 0; j <7; j++){if (s[j] > '0' && s[j] <= '9'){opnd.push(s[j] - '0');}else {if(optr.empty())//栈为空{optr.push(s[j]);}else {if (pri(s[j]) > pri(optr.top())) {optr.push(s[j]);}else {//while (pri(s[j]) <= pri(top)||optr.empty()==true)//栈外元素比栈顶元素优先级小或相等+栈不为空,两个条件才继续循环//while (pri(s[j]) <= pri(optr.top())&&!optr.empty())// 后判空,也是错误的。应该先判空!!!	while (!optr.empty()&&pri(s[j]) <= pri(optr.top()))						{int p = opnd.top();opnd.pop();int q = opnd.top();opnd.pop();//注意这里是:次栈顶元素加减乘除栈顶元素!!!int result = comp(optr.top(), q, p);opnd.push(result);optr.pop();							}optr.push(s[j]);}}}}//遍历结束后while (!optr.empty()){char top = optr.top();int p = opnd.top();opnd.pop();int q = opnd.top();opnd.pop();res= comp(top, q, p);opnd.push(res);optr.pop();}if (res == 24) {str[i] = "Yes";}else {str[i] = "No";}}for (int i = 0; i < n; i++) {cout << str[i] << endl;}return 0;
}

方法三:将中缀表达式转换为后缀来计算
注意:

①在使用STL容器涉及循环时,最好应该在每一次循环开始前清空,否则影响下一次循环。

②使用到的两个栈的数据类型是不一样的,注意字符和数字之间的转换。

思路:可参考之前写过的博客栈的应用之表达式求值(前缀、中缀、后缀)-CSDN博客

代码:

#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int pri(char op) {//设置优先级if (op == 'x' || op == '/') {return 2;}else if (op == '+' || op == '-') {return 1;}
}
int comp(char op, int x, int y) {//计算switch (op){case '+':return x + y; break;case '-':return x - y; break;case 'x':return x * y; break;case '/':return x / y; break;default:break;}
}
int main()
{int n;cin >> n;string s;stack<char>st1;//用来将中缀转换为后缀,存放符号stack<int>st2;//用来对后缀求值,存放数字,为int型vector<char>v;//用来存放后缀表达式string str[100];//存放结果for (int i = 0; i < n; i++) {cin >> s;int result = 0;//将中缀转换为后缀for (int j = 0; j < 7; j++){			if (s[j] > '0' && s[j] <= '9') {v.push_back(s[j]);}else {if (st1.empty()) {st1.push(s[j]);}else {if (pri(s[j]) > pri(st1.top())) {st1.push(s[j]);}else {while (!st1.empty() && (pri(s[j]) <= pri(st1.top()))){v.push_back(st1.top());st1.pop();}st1.push(s[j]);}}}}//遍历结束后while (!st1.empty()) {v.push_back(st1.top());st1.pop();}//对后缀求值for (vector<char>::iterator it = v.begin(); it != v.end(); it++){if (*it > '0' && *it <= '9'){int m = *it - '0';st2.push(m);}else {int p = st2.top() ;st2.pop();int q = st2.top();st2.pop();result = comp(*it, q, p);//char c = result + '0';st2.push(result);//注意这里要加‘0’}}if (result == 24) {str[i] = "Yes";}else {str[i] = "No";}while(!st2.empty()){st2.pop();}v.clear();}for (int i = 0; i < n; i++) {cout << str[i] << endl;}return 0;
}

三、总结

这应该是我写的最长时间的题目了,其实从上周二就开始写这道题,关键第一次看这题的时候,还觉得它很简单,以为不就是算术运算吗。真是啪啪打脸。根本原因还是自己忘了之前学过的栈的应用之表达式求值,它是做本题的最好方法。这次,又把它重新学了一下,感觉有了更深刻的体会和新的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426546.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理

文章目录 前言1、工程包结构2、POM依赖3、Java代码 前言 本篇主要针对前后端分离的项目&#xff0c;做的一个统一响应包装、统一异常捕获处理。 在Spring里&#xff0c;我们可以使用ControllerAdvice来声明一些关于controller的全局性的东西&#xff0c;其用法主要有以下三点…

建模杂谈系列256 规则函数化改造

说明 之前尝试用FastAPI来构造规则&#xff0c;碰到的问题是由于请求量过大(TPS > 1000), 从而导致微服务端口资源耗尽。所以现在的point是: 1 如何使用函数来替代微服务(同时要保留使用微服务的优点)2 进一步抽象并规范规则的执行3 等效合并规则的方法 内容 0 机制讨论…

数据中台建设(六)—— 数据开发-提取数据价值

数据开发-提取数据价值 数据开发涉及的产品能力主要包括三部分&#xff1a;离线开发、实时开发和算法开发。 离线开发主要包括离线数据的加工、发布、运维管理&#xff0c;以及数据分析、数据探索、在线查询和及时分析相关工作。实时开发主要涉及数据的实时接入和实时处理。算…

【算法】动态规划—最长回文子序列

思路分析 关于”回文串“的问题&#xff0c;是面试中常见的&#xff0c;本文提升难度&#xff0c;讲一讲”最长回文子序列“问题&#xff0c;题目很好理解&#xff1a; 输入一个字符串 s&#xff0c;请找出 s 中的最长回文子序列长度。 比如输入 s"aecda"&#xff0c…

WSL中使用AMBER GPU串行版

前提是已经安装过wsl 1 在 WSL 2 中启用 NVIDIA CUDA 参考在 WSL 2 上启用 NVIDIA CUDA | Microsoft Learn 注意&#xff1a;勿在 WSL 中安装任何 Linux 显示驱动程序。Windows 显示驱动程序将同时安装本机 Windows 和 WSL 支持的常规驱动程序组件。 2 在WSL2中配置Cuda 不安…

5G毫米波阵列天线仿真——CDF计算(手动AC远场)

之前写过两个关于阵列天线获取CDF的方法&#xff0c;一个通过Realized Gain&#xff0c;一个通过Power Flow&#xff0c; 三个案例中都是3D中直接波束扫描&#xff0c;并没有展示场路结合的情况。这期我们用Power Flow的方法&#xff0c;手动合并AC任务的波束计算CDF。 还是用…

Linux(7)--目录文件的创建、删除、移动、复制、重命名

文章目录 1. 创建目录、文件2. 删除目录、文件3. 移动目录、文件4. 复制目录、文件5. 重命名目录、文件 1. 创建目录、文件 使用mkdir创建目录&#xff1a; 使用touch创建文件&#xff1a; 2. 删除目录、文件 使用rm可以删除文件: 使用rm -f可以强制删除文件&#xff0c;…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

Linux权限理解【Shell的理解】【linux权限的概念、管理、切换】【粘滞位理解】

目录 Linux权限理解1.Xshell命令以及运行原理2.linux权限的学习2.1linux权限的切换2.2linux权限的概念2.3linux权限管理2.3.1linux中文件访问者的分类2.3.2文件类型和访问权限(文件属性)2.3.2.1文件类型2.3.2.2文件权限拓展—文件的起始权限 2.3.3文件权限管理2.3.4文件权限的应…

一文搞定WeakHashMap

写在前面 在缓存场景下&#xff0c;由于内存是有限的&#xff0c;不能缓存所有对象&#xff0c;因此就需要一定的删除机制&#xff0c;淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略&#xff0c;目前也有一些优秀的包提供了功能丰富的Cache&#xff0c;比如…

十八,Spring Boot 整合 MyBatis-Plus 的详细配置

十八&#xff0c;Spring Boot 整合 MyBatis-Plus 的详细配置 文章目录 十八&#xff0c;Spring Boot 整合 MyBatis-Plus 的详细配置1. MyBatis-Plus 的基本介绍2. Spring Boot 整合 MyBatis Plus 的详细配置3. Spring Boot 整合 MyBatis plus 注意事项和细节4. MyBatisx 插件的…

浅谈红外测温技术在变电站运维中的应用

0引言 随着市场经济的繁荣发展&#xff0c;社会对电力的需求持续增长。城市供电网络的规模和用电设备的总量也在不断扩大&#xff0c;这导致城市电力系统中潜在的网络安全隐患日益增多。作为电力系统核心组成部分的变压器&#xff0c;其安全、稳定的工作直接关系到电能的质量和…

总结拓展十:SAP开发计划(上)

第一节 功能开发说明书介绍 1、功能开发的基础分类 报表查询开发单据打印开发功能开发增强开发接口开发 2、屏幕元素介绍 ——程序屏幕是SAP系统与用户之间的桥梁&#xff0c;屏幕由各种不同元素布局组成 示例&#xff1a;选择屏幕界面 单选输入框 多选输入框 设定默认…

静态库 动态库

https://blog.csdn.net/mahoon411/article/details/113565482 库&#xff1a;可执行代码的二进制文件&#xff0c;里面有可以直接使用的函数&#xff0c;变量等&#xff1b;不能单独运行 因为 Linux 和 Win 的链接器、汇编器、编译器的不同&#xff0c;相同代码的库不同 Lin…

k8s介绍及部署

目录 一 Kubernetes 简介及部署方法 1.1 应用部署方式演变 1.2 容器编排应用 1.3 kubernetes 简介 1.4 K8S的设计架构 1.4.1 K8S各个组件用途 1.4.2 K8S 各组件之间的调用关系 1.4.3 K8S 的 常用名词感念 1.4.4 k8S的分层架构 二 K8S集群环境搭建 2.1 k8s中容器的管…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的&#xff1a;演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移&#xff0c;缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图&#xff08;包含在表格中&#xff0c;包含缩率图&#xff09; 显…

[数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;948 标注数量(xml文件个数)&#xff1a;948 标注数量(txt文件个数)&#xff1a;948 标注类别…

MySQL系列—12.Undo log

1、概念 DML 操作导致数据变化 , 将变化前的记录写入 Undo 日志。 作用 用于记录更改前的一份 copy &#xff0c;在操作出错时&#xff0c;可以用于回滚、撤销还原&#xff0c;只将数据库 逻辑地恢复到原来的样子 你 插入一条记录时&#xff0c;至少要把这条记录的主键值记下来…

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中&#xff0c;死信队列&#xff08;Dead Le…

典型BUCK电路学习和设计

手把手教你设计12V3Abuck降压电路-2-相关输入参数讲解_哔哩哔哩_bilibili 这里是输入电容&#xff0c;先过大电容&#xff08;电解电容&#xff09;再过小电容&#xff08;陶瓷贴片电容&#xff0c;高频率波&#xff09; 输出也可以同理 开关电源不能带负载的原因&#xff0c…