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 ...
随机推荐
- linux 上安装pstree
linux 无法使用pstree centos7上默认没有安装psmisc包. 1.在 Mac OS上 brew install pstree 2.在 Fedora/Red Hat/CentOS yu ...
- java中生成流水号的一个例子(使用BerkeleyDB)
package com.jiaoyiping.berkeleydb; import com.sleepycat.je.*; import com.sleepycat.utilint.StringUti ...
- CentOS6.8系统安装Oracle11g
1.官网上下载 软件安装包: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 解压后: 生成文件夹: datab ...
- C++ list容器系列功能函数详解
C++ list函数详解 首先说下eclipse工具下怎样debug:方法:你先要设置好断点,然后以Debug方式启动你的应用程序,不要用run的方式,当程序运行到你的断点位置时就会停住,也会提示你进 ...
- 记录用户操作历史命令history
我们知道可以使用history命令,查看自己的操作记录,但如果你是root用户,如何查看其它用户的操作记录呢? 其实history命令只是把当前用户目录下的~/.bash_History文件内容列 ...
- 8.ajax查询数据
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- C++ Websites
C++ Websites C++ 推荐网站 1.cprogramming.com 2.cppreference.com 3.cplusplus.com 4.Boost C++ Library
- python问答模块
""" 该模块功能:获取用户的输入文本,通过输入文本和数据库中的关键主题文本相比较, 获取最佳的回答内容 """ import xlrd i ...
- 清空messages方法
1.du -sh /var/log/messages 2.losf /var/log/messages 3.cat /dev/null > /var/log/messages 4.du -sh ...
- linux 如何查看防火墙是否开启
service iptables status可以查看到iptables服务的当前状态.但是即使服务运行了,防火墙也不一定起作用,你还得看防火墙规则的设置 iptables -L在此说一下关于启动和关 ...