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. hihocoder [Offer收割]编程练习赛14 投掷硬币

    题目2 : 投掷硬币 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一枚神奇的硬币.已知第i次投掷这枚硬币时,正面向上的概率是Pi. 现在小Hi想知道如果总共投 ...

  2. c#字符串切割split使用方法

    string strtest = "asdfg12wertgv1287654" "}, StringSplitOptions.RemoveEmptyEntries); 结 ...

  3. 表空间Tablespace

    SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改) Oracle Schema Objects——Tables——TableStorage 数据 ...

  4. redis cluster 集群畅谈(一)

    redis单机在大数据量情况的会出现瓶颈问题,通过redis 主从架构和 哨兵集群结合可以实现99.99% 高可用 .水平扩容支持更高QPS的解决方案. 在大数据量面前,主从架构结合哨兵集群的解决方案 ...

  5. Python开发【笔记】:进程

    序言 进程与线程概述: 很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运 ...

  6. rpyc

    import json import socket from thread import * from ansible_api import * from rpyc import Service fr ...

  7. Ubuntu18.04下安装比特币客户端

    一.下载有两种安装方式:安装包和源码 二.安装1.通过安装包安装在https://bitcoin.org/en/download下载Windows,Mac OSX,Linux对应的安装包.安装过程比较 ...

  8. .NET、NET Framewor以及.NET Core的关系(二)

    什么是CLR,.NET虚拟机? 实际上,.NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全.应用程序域.异常机制等支持,这些 都被统称为CLR公共语言运行库. CLR是.NET类型系统 ...

  9. Spring源码解析(四)Bean的实例化和依赖注入

    我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...

  10. 江苏新美星智能物流无人叉车AGV

    新美星一家全球领先的液体包装解决方案供应商,高附加值的产品应用于食品饮料等行业,为液体食品和自动化系统提供完整解决方案.新美星,于CBST2017展会首次亮相了能够从仓库或工厂的某个地方把材料.托盘和 ...