当前位置: 首页 > news >正文

UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式

题目链接:According to Bartjens
题目描述:

给定一个由数字和一个===组成的字符串,你需要在数字之间添加+,−,∗+,-,*+,,三种符号,在保证表达式合法的情况下(同时形成的新的数字不能有前导零),使表达式的结果等于200020002000,输出所有可能的添加方案(你至少要添加一个符号),按照字典序从小到大进行输出。
例如2100100=2100100=2100100=的解如下:
在这里插入图片描述

题解:

本题只知道至少添加一个符号,所以我们需要依次枚举添加一个、两个、三个一直到n−2n-2n2个(nnn为表达式的长度),然后使用DFSDFSDFS尝试在每个位置放置符号,放置的时候需要注意不能出现含有前导零的数字,保证不出现前导零有两种方案:

  • 枚举所有位置,在最后进行检查的时候判断出现在计算符号之后的数字以000开头但是位数大于111
  • 在搜索的过程中进行判断,假定搜索到位置pospospos如果当前位置是000那么当前位置的后面只能放置非数字符号;

如何计算表达式的值?可以使用逆波兰表达式,具体的使用两个栈,一个用来保存数字,一个用来保存符号,符号站里面的符号的优先级要保证递增:

  • 遇到数字则直接加入数字栈;
  • 遇到符号的时候,检查符号与符号栈栈顶的符号的优先级,如果栈顶的符号优先级较高或相等,那么则应该弹出栈顶的符号进行一次计算,直到符号栈为空,或者栈顶的符号优先级较低,再将当前的符号入栈;
  • 最后弹出符号栈里面的所有符号依次进行计算。

代码:

#include <bits/stdc++.h>const int NaN = 0x3f3f3f3f;
const int OPERATOR_NUM = 3;using namespace std;int maxDepth, caseID;
string expression, now;
char ope[] = "*+-";
vector<string> ans;// 比较两个运算符的优先级
int cmp(char op1, char op2)
{if (op1 == op2) { return 0; }if (op1 == '*') { return 1; }if (op2 == '*') { return -1; }return 0;
}// 计算两个数的和、差或者积
int calculate(int lhs, char ope, int rhs)
{if (ope == '+') { return lhs + rhs; }if (ope == '-') { return lhs - rhs; }return lhs * rhs;
}bool check()
{int num = NaN, lhs = 0, rhs = 0;stack<int> number;stack<char> ops;for (int i = 0; i < now.length() - 1; i++) {if (isdigit(now[i])) {if (num == NaN) { num = 0; }num = num * 10 + now[i] - '0';} else {number.push(num);while (!ops.empty() && cmp(ops.top(), now[i]) >= 0) {rhs = number.top(); number.pop();lhs = number.top(); number.pop();number.push(calculate(lhs, ops.top(), rhs));ops.pop();}ops.push(now[i]);num = NaN;}}if (num != NaN) { number.push(num); }while (!ops.empty()) {rhs = number.top(); number.pop();lhs = number.top(); number.pop();num = calculate(lhs, ops.top(), rhs); ops.pop();number.push(num);}return number.top() == 2000;
}void dfs(int nowDepth, int pos)
{if (nowDepth == maxDepth) {int tempLen = now.length();int increment = expression.length() - pos;now.append(expression.substr(pos, increment));if (check()) { ans.push_back(now); }now.erase(tempLen, increment);return;}if (maxDepth - nowDepth > expression.length() - 2 - pos) { return; }for (int i = pos; i < expression.length() - 2; i++) {// 这里是保证最后一个数字不含有前导零if (nowDepth == maxDepth - 1 && expression[i + 1] == '0' && expression[i + 2] != '=') { continue; }for (int j = 0; j < OPERATOR_NUM; j++) {int tempLen = now.length();int increment = i - pos + 1 + 1;now.append(expression.substr(pos, i - pos + 1));now.push_back(ope[j]);dfs(nowDepth + 1, i + 1);now.erase(tempLen, increment);}// 这里保证当前数字不含前导零,当前数字如果是以0开头那么不能继续进行拼接if (expression[pos] == '0') { break; }}
}int main()
{while (cin >> expression) {ans.resize(0);now = "";if (expression[0] == '=') { break; }for (maxDepth = 1; maxDepth < expression.length() - 1; maxDepth++) { dfs(0, 0); }caseID++;cout << "Problem " << caseID << endl;sort(ans.begin(), ans.end());for (auto str : ans) { cout << "  " << str << endl; }if (ans.size() == 0) { cout << "  IMPOSSIBLE" << endl; }}return 0;
}

相关文章:

UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式

题目链接&#xff1a;According to Bartjens 题目描述&#xff1a; 给定一个由数字和一个组成的字符串&#xff0c;你需要在数字之间添加,−,∗,-,*,−,∗三种符号&#xff0c;在保证表达式合法的情况下&#xff08;同时形成的新的数字不能有前导零&#xff09;&#xff0c;使表…...

c++基础/类和对象

c基础 2.1名字空间 namespace 防止命名冲突 说明&#xff1a;名字空间可以在全局作用域或其他作用域&#xff08;另一个名字空间&#xff09;内部定义&#xff0c;但不能在函数或类的内部定义。 使用&#xff1a; #include<iostream> using namespace std; //std中包…...

2023年中国人工智能产业趋势报告

易观&#xff1a;尽管2022年人工智能市场发展活跃度不及预期&#xff0c;但2022年对人工智能产业来说无疑是令人激动的一年。年中由DALL-E 2以及其后Stable Diffusion和Midjourney等文本-图像生成模型引起公众对人工智能生成内容的大量关注&#xff0c;年末ChatGPT的横空出世刷…...

STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…...

解决Sql WorkBench中数据库不能重命名的问题

解决Sql WorkBench中数据库不能重命名的问题mysql不支持直接重命名数据库1. 连接到数据库2. 打开菜单&#xff0c;选择迁移向导3. 点击Start Migration4. 填写源数据库的相应参数5. 填写目标数据库的响应参数6. 稍等片刻&#xff0c;点击Next7. 选择你要迁移的数据库。8. 进入一…...

REFL: 联邦学习中智能的设备选择方法

原创 齐天宇 隐私计算研习社 收录于合集#联邦学习54个现有的FL方案使用随机的参与者选择来提高选择过程的公平性&#xff0c;但是这会导致资源的低效利用和较低的训练质量。本文系统地解决了FL中资源效率低效的问题&#xff0c;展示了智能参与者选择和合并来自落后参与者的更新…...

Linux:NFS服务器

目录NFS服务器的介绍例NFS服务器的介绍 1&#xff0c;NFS&#xff08;网络文件系统&#xff09;&#xff0c;主要用于服务器分享提供文件或文件系统等服务&#xff0c;与其他服务器有所不同&#xff0c;主打的是分享&#xff0c;所以没有配置文件&#xff0c;只需要在 /etc/ex…...

电子技术——数字逻辑反相器

电子技术——数字逻辑反相器 在学习完如何通过CMOS数字电路实现组合逻辑&#xff0c;接下来我们评估这种数字CMOS电路的性能。首先&#xff0c;我们考虑最基本的部件——反相器。 电压传导特性 下图是一个反相器的原理图&#xff1a; 在之前&#xff0c;我们已经介绍了MOSFE…...

python的多线程编程之锁

1、 背景概述 在上篇文章中&#xff0c;主要讲述了python中的socket编程的一些基本方面&#xff0c;但是缺少关于锁的相关概念&#xff0c;从而在这篇文章中进行补充。 由于在python中&#xff0c;存在了GIL&#xff0c;也就是全局解释器锁&#xff0c;从而在每次进行获得cpu的…...

Android Framework-进程间通信——Binder

我们知道&#xff0c;同一个程序中的两个函数之间能直接调用的根本原因是处于相同的内存空间中。 比如有以下两个函数A和B&#xff1a; /*Simple.c*/ void A() { B(); } void B() { }因为是在一个内存空间中&#xff0c;虚拟地址的映射规则完全一致&#xff0c;所以函数A和B之…...

有趣的小知识(二)浏览器内的秘密:了解Cookie基础知识

一、简介 Cookie是一种小型的文本文件&#xff0c;由Web服务器发送给Web浏览器&#xff0c;并存储在用户的计算机硬盘上。它通常用于记录用户的偏好、登录状态、购物车信息等&#xff0c;以便在用户下次访问该网站时能够提供更好的用户体验。Cookie通常包含网站的名称、Cookie的…...

Spring框架

DI:依赖注入IOC:控制反转AOP:面向切面IOC容器&#xff1a;存放管理各种对象Spring优势&#xff1a;低耦合。&#xff08;降低组件之间的关联性&#xff0c;实现软件各层之间的解耦&#xff09;声明式事务管理&#xff08;基于AOP来管理&#xff09;和其他框架的整合&#xff08…...

mysql8的表锁排查

information_schema.innodb_trx ##正在运行的事务信息。 sys.innodb_lock_waits ##处于锁等待的关联事务信息。 performance_schema.threads ##SQL线程及线程号、进程号、OS线程号等信息 # 查询锁的情况 select * from performance_schema.data_locks where object_name =t_xxx…...

【C语言】深度理解指针(上)

前言&#x1f30a;谈到指针&#xff0c;想必大家都不陌生。它不仅是C语言的重难点&#xff0c;还是不少C初学者的噩梦。本期我们将深度探讨一些较为复杂的指针以及指针的妙用&#xff0c;带领大家感受指针的魅力&#x1f61d;。首先&#xff0c;我们先来复习复习指针的概念&…...

最近我的视频播放浅学总结

因为想做一个类似苹果的同播共享功能&#xff0c;这一段时间对音视频做了一些浅浅的学习&#xff0c;现简单总结记录。 我的需求是找到一个尽可能简单的方案来两人播放一段视频&#xff0c;并且能够进度和操作同步&#xff0c;所以基本不能有延迟&#xff0c;同时能够显示WebV…...

【C/C++基础知识点】输出n位斐波那契数列

目录 前言什么是斐波那契数列兔子的故事小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就…...

C语言拔高知识——指针的进阶(万字大文超详细)

在之前的文章中&#xff0c;我已经讲解过了初阶指针的内容&#xff0c;今天就来讲一讲指针的进阶&#xff01; 上篇指针地址&#xff1a;保姆式指针讲解&#xff0c;超详细&#xff0c;适合初学者_指针详解_陈大大陈的博客-CSDN博客 目录 1. 字符指针 2. 指针数组 3. 数组指…...

程序员推荐的良心网站合集!(第二期)

今天来给大家推荐几个程序员必看的国外良心网站合集第二期合集。 Semantic Schoolar 由微软联合创始人Paul Allen开发的免费学术搜索引擎&#xff0c;不仅可以通过时间线快速定位想要的文献&#xff0c;还有强大的筛选功能可以精准的找到自己想要的文献&#xff0c;想要什么搜…...

【Java核心知识】spring boot整合Mybatis plus + Phoenix 访问Hbase与使用注意

为了Phoenix能让开发者通过SQL访问Hbase而不必使用原生的方式&#xff1f;引用Phoenix官网上的一句话&#xff1a;SQL is just a way of expressing what you want to get not how you want to get it. 即SQL不是一种数据操作技术&#xff0c;而是一种特殊的表达方式。只是表示…...

lua实现游戏全局鼠标点击效果

前言 最近在优化项目,策划提了一个需求,需要实现一个通用点击特效。 尝试1 首先想到的是改变鼠标指针样式,这个以前学过,还有点印象,以前刚开始学unity的时候,记得看到过一个方法可以改变游戏中鼠标指针样式。 方法如下:选择“Edit”——>“Project Setting”,打…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...