UVa 1662 Brackets Removal
https://vjudge.net/problem/UVA-1662
题意:
给出一个序列,判断序列中哪些括号是可以去掉的,只可以改变符号。输出括号最少的序列。
思路:
感觉这道题目就是写起来繁琐了点,我的代码比较啰嗦..
先保存每对括号的左右坐标,然后对于每一对括号,我们去寻找它前面和后面的符号,如果前后有乘除号并且括号内有加减号,那么这括号肯定是不能去掉的。另外的情况下都是可以去掉括号的,当然了,如果前面是减号或者是除号,有些符号需要相应的改变。
还有要注意一点,很重要!!
就是如果有对括号是不能去掉的,那么对于括号内的符号,我们需要标记一下。这样当我们考虑在它外面的大括号时,就不去考虑它里面的情况。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF=0x3f3f3f3f3f;
const int maxn=+; int cnt;
int len;
char str[maxn];
int vis[maxn]; struct node
{
int l,r;
int d;
bool operator<(const node& rhs) const
{
return d<rhs.d ||(d==rhs.d && l<rhs.l);
}
}a[maxn]; int left_work(int L)
{
if(str[L]=='+') return ;
else if(str[L]=='-') return ;
else if(str[L]=='*') return ;
else if(str[L]=='/') return ;
else return -;
} int right_work(int R)
{
if(str[R]=='+') return ;
else if(str[R]=='-') return ;
else if(str[R]=='*') return ;
else if(str[R]=='/') return ;
else return -;
} int main()
{
// freopen("brackets.in","r",stdin);
//freopen("brackets.out","w",stdout);
//freopen("D:\\input.txt","r",stdin);
while(~scanf("%s",str+))
{
cnt=;
stack<int> sp;
memset(vis,,sizeof(vis)); len=strlen(str+);
for(int i=;i<=len;i++)
{
if(str[i]=='(') sp.push(i);
else if(str[i]==')')
{
int x=sp.top(); sp.pop();
a[cnt].l=x;
a[cnt].r=i;
a[cnt].d=i-x;
cnt++;
}
} sort(a,a+cnt);
/*
for(int i=0;i<cnt;i++)
cout<<a[i].l<<" "<<a[i].r<<endl;
*/ for(int i=;i<cnt;i++)
{
bool flag=true;
int L=a[i].l,R=a[i].r; int l_op=left_work(a[i].l-);
int r_op=right_work(a[i].r+); //前后有乘除号但括号内有加减号
if(l_op==||l_op==||r_op==||r_op==)
{
for(int i=L+;i<R;i++)
{
if(vis[i]==-) continue;
if(str[i]=='+'||str[i]=='-') {flag=false;break;}
} //不可变
if(!flag)
{
for(int i=L;i<=R;i++)
if(vis[i]==) vis[i]=-;
}
} //处理前面无符号或为加号
if((l_op==-||l_op==)&&flag)
{
vis[L]=vis[R]=;
} //处理减号
if(l_op== && flag)
{
vis[L]=vis[R]=;
for(int i=L+;i<R;i++)
{
if(str[i]=='-' && vis[i]!=-) str[i]='+';
else if(str[i]=='+' && vis[i]!=-) str[i]='-';
}
} //处理乘号
if(l_op== && flag)
{
vis[L]=vis[R]=;
} //处理除号
if(l_op== && flag)
{
vis[L]=vis[R]=;
for(int i=L;i<=R;i++)
{
if(str[i]=='*' && vis[i]!=-) str[i]='/';
else if(str[i]=='/' && vis[i]!=-) str[i]='*';
}
}
} for(int i=;i<=len;i++)
{
if(vis[i]!=)
printf("%c",str[i]);
}
printf("\n");
}
return ;
}
UVa 1662 Brackets Removal的更多相关文章
- UVa 1626 Brackets sequence (动态规划)
题意:用最少的括号将给定的字符串匹配,输出最优解.可能有空行. 思路:dp. dp[i][j]表示将区间i,j之间的字符串匹配需要的最少括号数,那么 如果区间左边是(或[,表示可以和右边的字符串匹配, ...
- UVA 2451 Brackets sequence
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=9 ...
- UVa 1626 - Brackets sequence(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1626 Brackets sequence(括号匹配 + 区间DP)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp ...
- UVA 1626 Brackets sequence 区间DP
题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...
- UVA - 1626 Brackets sequence (区间dp)
题意:给定一个串,可能空串,或由'[',']','(',')'组成.问使其平衡所需添加最少的字符数,并打印平衡后的串. 分析:dp[i][j]表示区间(i,j)最少需添加的字符数. 1.递推. #in ...
- UVa 1626 (输出方案) Brackets sequence
正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...
- 【Uva 1626】Brackets sequence
[Link]: [Description] 括号序列由这样的规则生成: 1.空字符是一个括号序列; 2.在括号序列两端加上一对括号也是括号序列; 如(s),[s]; 3.两个括号序列A和B,连在一起, ...
- UVA 11990 ``Dynamic'' Inversion 动态逆序对
``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...
随机推荐
- Web和Native使用外部字体ttf方法
论坛教程:http://bbs.egret.com/forum.php?mod=viewthread&tid=24879&extra=&highlight=%E5%AD%97% ...
- nodejs MySQL操作
一 wamp创建数据库 选择phpMyAdmin 选择用户,添加用户 填写数据库详细资料,填写完毕选择右下角的“执行” 用户添加成功 2. nodejs 安装mysql驱动 npm install ...
- 【Object.prototype.toString.call()】---判断某个对象属于哪种内置类型------【巷子】
预热:目前我们知道区分对象类型的方式有三种 :type instanceof Object.prototype.toString.call. 那么这三种的区别是什么呢? type 在 Java ...
- 利用Dockerfile构建一个基于CentOS 7镜像
利用Dockerfile构建一个基于CentOS 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像. Dockerfile内容如下: FROM centosMAINTA ...
- VM+CentOS+hadoop2.7搭建hadoop完全分布式集群
写在前边的话: 最近找了一个云计算开发的工作,本以为来了会直接做一些敲代码,处理数据的活,没想到师父给了我一个课题“基于质量数据的大数据分析”,那么问题来了首先要做的就是搭建这样一个平台,毫无疑问,底 ...
- Python爬虫scrapy-redis分布式实例(一)
目标任务:将之前新浪网的Scrapy爬虫项目,修改为基于RedisSpider类的scrapy-redis分布式爬虫项目,将数据存入redis数据库. 一.item文件,和之前项目一样不需要改变 # ...
- python中super的使用
转自:http://python.jobbole.com/86787/ super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, ...
- Bungee Jumping---hdu1155(物理题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1155 题目很长,但是很容易理解,就是人从高s的桥上跳下来,手拉着长为l的绳子末端,如果绳子太短那么人将 ...
- 当Web访问性能出现问题,如何深探?
对运维或开发工程师来说,遇到访问性能问题时,最先需要定位的是问题出现在哪个环节,是网络的问题,服务端的问题,还是客户端的问题? 往往技术人员喜欢把精力放在保障后端服务的可用性方面,而对前端界面是否能正 ...
- (转)rabbitmq.config详细配置参数
rabbitmq.config详细配置参数 Key Documentation tcp_listeners 用于监听 AMQP连接的端口列表(无SSL). 可以包含整数 (即"监听所有接口& ...