2014牡丹江K Known Notation

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

看来只要认真思考,这些较为简单的题都是可以A的。

想了一个上午,一开始没把逆波兰表达式的可能性想清楚,导致算法错误,后来想到只要前面数字的个数大于*的个数,都是成立的,而且交换要比增加效率高。只有当数字个数小于*个数的时候才会增加数字,而且增加在最前面,这样是最优方案。之后只要发现到某一位*的个数大于等于数字的个数了,就把*和最后一个数字交换就可以了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define M(a,b) memset(a,b,sizeof(a))
 7 typedef long long LL;
 8 using namespace std;
 9
10 char num[1005];
11
12 int main()
13 {
14     int t;
15     int ans = 0;
16     scanf("%d",&t);
17     while(t--)
18     {
19         scanf("%s",num);
20         int sl = strlen(num);
21         int cnt1 = 0;
22         int cnt2 = 0;
23         int flag = -1;
24         int bu = 0;
25         int seg = 0;
26         int step = 0;
27         int save = -1;
28         for(int i = sl-1;i>=0;i--)
29         {
30             if(num[i]==‘*‘)
31               save = i;
32         }
33         if(num[sl-1] != ‘*‘)
34         {
35             if(save!=-1)
36               {swap(num[sl-1],num[save]);
37                step++;}
38         }
39         int tm1 = 0;
40         int tm2 = 0;
41         int ed;
42         for(int i = 0;i<sl;i++)
43         {
44             if(num[i]==‘*‘) tm1++;
45             else tm2++;
46         }
47         if(tm1>=tm2) {
48                 step+=(tm1-tm2+1);
49          cnt2=(tm1-tm2+1);
50          ed = cnt2;
51         }
52         //cout<<ed<<endl;
53         for(int i = 0;i<sl;i++)
54         {
55             if(num[i]==‘*‘)
56             {
57                 cnt1++;
58                 if(cnt1>=cnt2)
59                 {
60                     int te1,te2;
61                     for(int p = 0;p<sl;p++)
62                         if(num[p] != ‘*‘) te1 = p;
63                     for(int q = sl-1;q>=0;q--)
64                         if(num[q] == ‘*‘) te2 = q;
65                     swap(num[te1],num[te2]);
66                     step++;
67                     cnt1 = 0;
68                     cnt2 = ed;
69                     i = -1;
70                     continue;
71                 }
72             }
73             else cnt2++;
74         }
75         printf("%d\n",step);
76     }
77     return 0;
78 }
时间: 2024-10-22 14:32:14

2014牡丹江K Known Notation的相关文章

ACM学习历程——ZOJ 3829 Known Notation (2014牡丹江区域赛K题)(策略,栈)

Description 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

ZOJ 3829 Known Notation (2014牡丹江H题)

题目链接: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. I

ZOJ 3826 Hierarchical Notation(2014 牡丹江 H,字符串模拟)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5380 Hierarchical Notation Time Limit: 2 Seconds      Memory Limit: 131072 KB In Marjar University, students in College of Computer Science will learn EON (Edward Object Notation), which is a

2014牡丹江区域赛K(贪心)ZOJ3829

Known Notation Time Limit: 2 Seconds      Memory Limit: 131072 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 expre

2014牡丹江——Known Notation

题目链接 题意: 输入一个长度不超过1000的字符串,包含数字(1-9)和星号(*).字符串中的空格已经丢失,所以连起来的数字串能够看成很多分开的数.也能够看成连续的数,即能够随意加入空格. 如今有两种操作:1)在任何位置加入随意类型的字符(数字或者星号)    2)交换字符串中的随意两个字符 求:最少操作多少次,使得得到的串是一个合法的逆波兰式 分析: 对于n个星号,n+1个数字的字符串,假设将星号都移动到串的末尾.那么一定是合法的 对于操作1,假设须要插入数字,那么插入到字符串的最前边是最优

2014牡丹江——Hierarchical Notation

题目链接 字符串模拟 const int MAXN = 2000000; char ipt[MAXN], t[MAXN]; int f[MAXN], len, to[MAXN]; map<string, string> mp[MAXN]; string x, key, ans; string i2s(int n) { string ret = ""; if (n == 0) ret += '0'; else { while (n) { ret += n % 10 + '0'

2014 牡丹江赛区总结

随着上海赛区比赛的结束,2014赛季也告一段落了.是时候总结一下.. 从网络赛开始..就深感到自己实力的不足,除了牡丹江网络赛中出了一道搜索+剪枝之外,似乎我就没有做出什么贡献..总是冒充Java专业选手写写高精度..上网百度模板什么的..尝试开了几次大模拟或者复杂搜索也没能够现场做出来.总之就是感觉自己能力十分不足. 然后我,Wzy,1243France作为2014年AHU的首发去了牡丹江.牡丹江基本上是被看做最弱的赛区吧.所以教练放心大胆的让我们三个13级的去,虽然结果是很遗憾的.我们到牡丹

ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集

Untrusted Patrol Time Limit: 3 Seconds                                     Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure t

2015.10.15 --- 2014 牡丹江

练了好久的了 过了4题 现在才补 真是懒成dog了--- A 签到 B 练的时候虽然讨论出了正确的做法,,可是当时根本不觉得是对的- - 做法是,求三次树的直径 第一次,求出整棵树的直径,找到直径的中点,将整棵树分成两颗子树 第二次,求出第一棵子树的直径的中点 第三次,求出第二棵子树的直径的中点 -------写了好几天----最后还是看了题解的写法--- 自己写的又wa又T的-----好----搓----啊---- 有两个地方自己写的时候没有搞太清楚, 先是将整棵子树分成两半的时候,不知道从哪