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的更多相关文章

  1. UVa 1626 Brackets sequence (动态规划)

    题意:用最少的括号将给定的字符串匹配,输出最优解.可能有空行. 思路:dp. dp[i][j]表示将区间i,j之间的字符串匹配需要的最少括号数,那么 如果区间左边是(或[,表示可以和右边的字符串匹配, ...

  2. UVA 2451 Brackets sequence

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=9 ...

  3. UVa 1626 - Brackets sequence(区间DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA 1626 Brackets sequence(括号匹配 + 区间DP)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp ...

  5. UVA 1626 Brackets sequence 区间DP

    题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...

  6. UVA - 1626 Brackets sequence (区间dp)

    题意:给定一个串,可能空串,或由'[',']','(',')'组成.问使其平衡所需添加最少的字符数,并打印平衡后的串. 分析:dp[i][j]表示区间(i,j)最少需添加的字符数. 1.递推. #in ...

  7. UVa 1626 (输出方案) Brackets sequence

    正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...

  8. 【Uva 1626】Brackets sequence

    [Link]: [Description] 括号序列由这样的规则生成: 1.空字符是一个括号序列; 2.在括号序列两端加上一对括号也是括号序列; 如(s),[s]; 3.两个括号序列A和B,连在一起, ...

  9. UVA 11990 ``Dynamic'' Inversion 动态逆序对

    ``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...

随机推荐

  1. salt更换新key

    1  停止salt-minion服务 service salt-minion stop 2 删除salt-minion公钥文件 rm /etc/salt/pki/minion/minion.pub r ...

  2. Sql Server 关于列名带中括号"[]"的问题

    1.如果列名为数据库的关键字则自动加上中括号“[]” 例如[level] 2.如果列名中带有特殊符号.[date(a)] 数据存储的过程: 1.在添加数据的时候:要带有中括号,有必要在添加参数的时候不 ...

  3. android去除Spinner的分割线

    <style name="TestSpinnerStyle" parent="android:style/Widget.ListView.DropDown" ...

  4. Linux下安装和卸载jdk步骤详述

    安装jdk 1.下载jdk8 jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21331 ...

  5. linux中增加swap分区文件的步骤方法

     一.swap交换分区 Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临 ...

  6. 容斥原理解决某个区间[1,n]闭区间与m互质数数量问题

    首先贴出代码(闭区间[1,n]范围内和m互质的数) 代码: int solve(II n,II m){ vector<II>p; ;i*i<=m;i++){ ){ p.push_ba ...

  7. Python之numpy基本指令

    https://blog.csdn.net/mmm305658979/article/details/78745637 # -*- coding: utf-8 -*- 多加练习才是真 import n ...

  8. 服务器为什么这么慢?耗尽了CPU、RAM和磁盘I/O资源

    机器运行缓慢通常是由于消耗了太多系统特定的资源.系统的主要资源包括CPU.RAM.磁盘I/O以及网络.过度使用这些资源的任何一种都会让系统陷入困境.不过,如果能登录到系统之中,可以借助大量工具确定问题 ...

  9. 第1章 1.10计算机网络概述--OSI参考模型和TCP_IP协议

    传输层负责将大数据文件分段,变成数据段. 网络层负责为小分段加上IP地址,变成数据包. 数据链路层负责将数包加上MAC地址和校验值,变成数据帧. TCP/IP协议是一群协议.不只是2个协议.

  10. 利用CombineFileInputFormat把netflix data set 导入到Hbase里

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xiewenbo/article/details/25637931 package com.mr.te ...