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 Netfilter注册钩子点
注册钩子点首先要包含响应的头文件,因为这应该已经属于对kernel的编程了. #include <linux/module.h> #include <linux/kernel.h&g ...
- Array数组去重
1.循环方法 function methodOne(arr){ var result = [], arrLen = arr.length, item = null, i,j; for(var i = ...
- 【Android】Android 发送短信和打电话的方法
发送短信的方法 有两种方法可以实现发送短信,其一是使用intent-startActivity,URI数据格式为"smsto:num",调用的action为Intent.ACTIO ...
- Win10安装软件时出现2502、2503错误代码的问题
主要是权限不够,C:\Windows\temp先访问权限 找到该目录,选择temp文件夹,右键弹出快捷菜单,选择“管理员取得所有权”.确定,OK. 再安装软件OK.
- #pragma once含义及用法
#pragma once是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次. #pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体 ...
- javascript 执行环境,作用域链和闭包
首先看下这条语句: (function($) {…})(jQuery): 1.原理: function(arg){…}这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的, ...
- MySQL 数据库的主从配置
mysql主从配置.鄙人是在如下环境测试的: 主数据库所在的操作系统:win7 主数据库的版本:5.0 主数据库的ip地址:192.168.1.111 从数据库所在的操作系统:linux 从数据的版本 ...
- COURSES---poj1469 hdu1083(最大匹配)
题目链接:http://poj.org/problem?id=1469 http://acm.hdu.edu.cn/showproblem.php?pid=1083 题意:有n个学生p门课, 每门 ...
- innobackupex 还原和备份实例
InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件来做的,但是实现的方式不同,前者是以page为粒度做的(xtrabackup),后者是 cp 或者 tar 命令(innobackupex) ...
- 8.python中双冒号(::)的用法
s[i:j:k]是,根据该“片第从i到j与第k步”.何时i和j缺席,整个序列是和s[::k]意思是“每k个项目”. 示例 首先,让我们来初始化一个列表: >>> s = range( ...