题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383

Known Notation


Time Limit: 2 Seconds      Memory Limit: 65536 KB


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

3
1*1
11*234**
*

Sample Output

1
0
2

Author: CHEN, Cong
Submit    Status 题目意思:

给1~9和*组成的一个字符串,能够有两种操作加入一个数字或*,交换随意两个字符。求最少的步数使的式子为逆波兰式。

解题思路:
贪心+模拟

1、当数字个数小于等于*个数时。要加数字使得其个数为*的个数。

2、111*111这样的情况答案为1,记录当前数字的最少个数和最多个数。*隔开的是两部分。数字不能连在一起,要分别加Mi,Ma。

3、假设前面数字不够,就把最后面的数字和当前的*交换。注意交换后能够和前面数字连成一片,是一个部分。所以此时Mi不能加。

代码:

//#include<CSpreadSheet.h>#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;#define Maxn 1100char sa[Maxn];
int n;int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int t;scanf("%d",&t);while(t--){scanf("%s",sa+1);n=strlen(sa+1);int cnt1=0,cnt2=0;int la=0,Ma,Mi,p,ans=0;for(int i=1;i<=n;i++){if(sa[i]=='*')cnt2++;elsecnt1++;}if(cnt1<=cnt2){ans+=cnt2+1-cnt1;la=cnt2+1-cnt1;}for(p=1;p<=n&&sa[p]!='*';p++)if(p>n){printf("0\n");continue;}la+=p-1;Ma=la;if(la)  //注意这里差别一開始都是*的情况Mi=1;elseMi=0;//printf("Mi:%d Ma:%d la:%d p:%d\n",Mi,Ma,la,p);//system("pause");for(;p<=n;p++){if(sa[p]=='*'){if(Ma<=1) //非得交换{ans++;for(int j=n;j>p;j--){if(sa[j]!='*')//最后一定有数字。一定能够交换{swap(sa[p],sa[j]);break;}}int temp=0;while(p<=n&&sa[p]!='*')temp++,p++;Ma+=temp;if(!Mi)Mi=1;  //为第一个  否则不能把Mi加一个。交换后能够连在一起的p--;}else  //{if(Mi>1)Mi--;Ma--;}}else{int temp=0;while(p<=n&&sa[p]!='*')temp++,p++;Mi++;  //注意*隔开的两部分。不能连在一起,所以Mi要加一Ma+=temp;p--;}}ans+=Mi-1;printf("%d\n",ans);}return 0;
}
/*
111*111
1*11*11
*/

转载于:https://www.cnblogs.com/jzdwajue/p/6834310.html

[贪心+模拟] zoj 3829 Known Notation相关推荐

  1. ZOJ 3829 Known Notation(贪心)题解

    题意:给一串字符,问你最少几步能变成后缀表达式.后缀表达式定义为,1 * 1 = 1 1 *,题目所给出的字串不带空格.你可以进行两种操作:加数字,交换任意两个字符. 思路:(不)显然,最终结果数字比 ...

  2. ZOJ 3829 Known Notation(贪心)

    题目链接 题意 :给你一个字符串,但是空格丢失,问你需要多少次操作能够让这个字符串可以看成合法的逆波兰式,例如12*3*4不是合法的逆波兰式,但是12*34*可以看成1 2*34*是正确的逆波兰式. ...

  3. 校内hu测(10.6T2,T3)(乱搞+贪心+模拟)

    @liu_runda T2.便(then) [题目描述] 给出一个R*C的棋盘.共有R行C列,R*C个格子.现要在每个格子都填一个非负整数.使得任意一个2*2的正方形区域都满足这样的性质:左上角的数字 ...

  4. 【NOIP2013】积木大赛(差分数组,贪心模拟)

    题目 原题链接 问题描述 分析 直观思路--贪心模拟:每次都处理最长正整数区段. 以[2,3,4,1,2][2,3,4,1,2][2,3,4,1,2]为例: [2,3,4,1,2]⟹[1,2,3,0, ...

  5. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  6. ZOJ 3826 Hierarchical Notation 模拟

    模拟: 语法的分析 hash一切Key建设规划,对于记录在几个地点的每个节点原始的字符串开始输出. . .. 对每一个询问沿图走就能够了. .. . Hierarchical Notation Tim ...

  7. ZOJ 3822 Known Notation(2014牡丹江Regional K题)

    题目大意:给你一个不完整的后缀表达式和两种操作,一是插入一个数或者"*"运算号,另一个是把数字和"*"交换. 一个*至少对应两个数字,而一个表达式又等于一个数字 ...

  8. 模拟 ZOJ 3878 Convert QWERTY to Dvorak

    题目传送门 1 /* 2 模拟:手敲map一一映射,累! 3 除了忘记读入字符串不能用gets用getline外还是很顺利的AC了:) 4 */ 5 #include <cstdio> 6 ...

  9. HDU - 6746 Civilization(贪心+模拟)

    题目链接:点击查看 题目大意:中文题面 题目分析:一道比赛时写崩了的模拟,赛后参考别人的代码,发现原来这个题目可以写的如此简单 说会题目,n 只有 500 ,可以 n * n 枚举每个位置作为起点,对 ...

  10. CodeForces - 1362E Johnny and Grandmaster(贪心+模拟)

    题目链接:点击查看 题目大意:给出一个基数 p ,再给出 n 个指数 k ,换句话说,现在有一个长度为 n 的序列,每个元素都是 p^k[ i ] ,现在需要将这个序列分到两个集合中,使得两个集合元素 ...

最新文章

  1. 人体姿态和形状估计的视频推理:CVPR2020论文解析
  2. 深入理解卷II ---ICS源代码下载
  3. 机器学习笔记:Transformer
  4. java strategy模式,Java Strategy 模式简介
  5. ORACLE 物化视图
  6. 大端模式、小端模式、网络字节顺序与主机字节顺序
  7. 笑得肚痛!程序猿的 46 张 GIF 搞笑图
  8. 从零开始学sai,5天精通板绘基础
  9. swfobject.js
  10. Java_socket通信基础补充
  11. NYOJ_613_免费馅饼
  12. NetWorker Pro for Mac (菜单栏网速监测显示工具) v8.11
  13. 分享六款原型设计软件,交流协作更便捷
  14. unity基础(3)——从Unity Asset store获取资源
  15. 两台电脑如何直接用一根网线传数据
  16. 朋友圈投票活动-刷票案例实现与分析
  17. 线性方程组的解个数与秩的关系
  18. 分布式系统(三) 分布式事务服务搭建
  19. ThinkPHP5之图片下载
  20. Unity 解决远距离模型闪烁(Z-Fighting )方案

热门文章

  1. HCIE Security 防火墙NAT技术 备考笔记(幕布)
  2. 记一次DNS运维排错
  3. MySQL 第六次练习(索引)
  4. Leetcode 刷题笔记(十六) —— 二叉树篇之二叉搜索树的属性
  5. centos6 与 7 其中的一些区别
  6. 【网络文件共享】04、rsync基础
  7. Flappy Bird 单机版
  8. MongoDB日志工作流程
  9. word打开提示“所用加密类型不可用”
  10. SQL语句更改数据库名,表名,列名