6979 Known Notation
Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and
computer science. It is also known as postfix notation since every operator in an expression follows all
of its operands. Bob is a student in Marjar University. He is learning RPN recent days.
To clarify the syntax of RPN for those who haven’t learnt it before, we will offer some examples
here. For instance, to add 3 and 4, one would write “3 4 +” rather than “3 + 4”. If there are multiple
operations, the operator is given immediately after its second operand. The arithmetic expression
written “3 - 4 + 5” in conventional notation would be written “3 4 - 5 +” in RPN: 4 is first subtracted
from 3, and then 5 added to it. Another infix expression “5 + ((1 + 2) × 4) - 3” can be written down
like this in RPN: “5 1 2 + 4 × + 3 -”. An advantage of RPN is that it obviates the need for parentheses
that are required by infix.
In this problem, we will use the asterisk “*” as the only operator and digits from “1” to “9” (without
“0”) as components of operands.
You are given an expression in reverse Polish notation. Unfortunately, all space characters are
missing. That means the expression are concatenated into several long numeric sequence which are
separated by asterisks. So you cannot distinguish the numbers from the given string.
You task is to check whether the given string can represent a valid RPN expression. If the given
string cannot represent any valid RPN, please find out the minimal number of operations to make it
valid. There are two types of operation to adjust the given string:
1. Insert. You can insert a non-zero digit or an asterisk anywhere. For example, if you insert a “1”
at the beginning of “2*3*4”, the string becomes “12*3*4”.
2. Swap. You can swap any two characters in the string. For example, if you swap the last two
characters of “12*3*4”, the string becomes “12*34*”.
The strings “2*3*4” and “12*3*4” cannot represent any valid RPN, but the string “12*34*” can
represent a valid RPN which is “1 2 * 34 *”.
Input
There are multiple test cases. The first line of input contains an integer T indicating the number of
test cases. For each test case:
There is a non-empty string consists of asterisks and non-zero digits. The length of the string will
not exceed 1000.
Output
For each test case, output the minimal number of operations to make the given string able to represent
a valid RPN.
Sample Input

1*1
11*234**
*ACM-ICPC Live Archive: 6979 – Known Notation 2/2
Sample Output

题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set> #define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define CT continue
#define SC scanf char s[1005];
int main()
{
int cas;SC("%d",&cas);
while(cas--){
SC("%s",s);
int len=strlen(s),num=0,ln=0,star=0,ans=0;
for(int i=0;s[i]!='\0';i++)
if(s[i]=='*') star++;
else num++;
if(num<star+1) {ans+=star+1-num;ln=star+1-num;} for(int i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9') ln++;
else{
if(ln>=2) ln-=1;
else {
ans++;
for(int j=len-1;j>=0;j--) if(s[j]!='*'){
swap(s[j],s[i]);ln++;break;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}

  错因分析:看错题目了,,以为只能相邻两个交换,结果想了两个多小时,,,Orz;

构造:

(1).首先,我们可以看到对于有k个*的话。至少k+1个数字才能保证合法,所以不够的话,需要添加

(2).然后可以构造出11111...**...这样在满足(1)的前提下必然不需要然和操作就能保证合法的式子。

贪心:考虑到当前额*,因为不合法,那么至少需要一个操作才能保证合法,由构造可知,将该*掉到

末尾的数字上去,不仅能保证再次遇到该*时不再浪费额外的操作,也能尽量的贪心,让该*之后的接下来的

*有更多的数字去抵消,尽可能的不需要交换。

最新文章

  1. django关系对象映射(Object Relational Mapping,简称ORM)
  2. linux cron计划任务
  3. 怎么解决svn清理失败且路径显示乱码问题
  4. bzoj 1415 期望+记忆化搜索 ****
  5. 【 D3.js 高级系列 — 9.0 】 交互式提示框
  6. hdu5548
  7. eclipse+axis2+webservice开发实例
  8. solr集群solrCloud的搭建
  9. Struts2 中action之间的跳转(分享)
  10. learn objetive-c
  11. java web面试
  12. VR全景智慧城市—城市就在你眼前
  13. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)
  14. Quartz学习笔记1:Quartz概述
  15. Android 在Fragment中执行onActivityResult不被调用的简单解决方法
  16. 使用spark访问hive错误记录
  17. 2017-3-30/HTTP协议2
  18. linux学习笔记-12.输入输出重定向及管道
  19. Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found
  20. 2017-2018-1 JaWorld 团队作业--冲刺2

热门文章

  1. docker-compose搭建elasticsearch+kibana环境,以及php使用elasticsearch
  2. python pyyaml 使用教程(代码案例)
  3. shell脚本查询某一目录的某一部分文件并且拷贝到其他目录(有则跳过没有则拷贝)
  4. Cache的一些总结
  5. SpringBoot的数据访问
  6. 08 redis缓存穿透、缓存雪崩、缓存击穿
  7. webpack4快速上手
  8. 使用FindCmdLineSwitch处理命令行参数
  9. 简单服务器通信 模型socketserver
  10. kubernetes容易混淆的几个端口