版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38081836/article/details/83418968
题意:给出一个字符串(只含有数字和乘号),以及两种操作,分别为:
- 向该字符串中插入一个字符(数字或者乘号)
- 交换字符串中任意两个字符
回答最少需要几次操作能把字符串变成一个合法的后缀表达式。
题解:我们首先考虑如果乘号放在最后肯定是没有问题的,无论怎样只要有足够多的数字乘号一定能够用完。同理数字放在最前面也是可以的。根据上述理论贪心即可,如果该字符是乘号,那么判断他前面的运算数字的个数(多了不影响),如果不够的话将乘号与最后一个数字交换位置,如果没有数字那么就插入相应的字符。
数组开小竟然会TLE,心里难受
/****hqx is the best****/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define met(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define per(i, a, b) for(int i = a; i >= b; i--)
const int maxn = 1e3 + 10;
const int inf = 0x3f3f3f3f;
int T;
char s[maxn];
int main() {
scanf("%d", &T);
while(T--) {
scanf("%s", s);
int len = strlen(s), dig = 0, ch = 0;
rep(i, 0, len - 1) {
if(s[i] == '*') ch++;
else dig++;
}
int num = 0, ans = 0;
rep(i, 0, len - 1) {
if(s[i] == '*') {
if(num >= 2) {
num--;
} else {
if(num == 1) {
if(dig >= ch + 1) {
for(int j = len - 1; j > i; j--) {
if(s[j] == '1') {
swap(s[i], s[j]);
break;
}
}
ans++;
num++;
} else {
ans++;
dig++;
}
} else {
if(dig >= ch + 1) {
ans++;
num++;
for(int j = len - 1; j > i; j--) {
if(s[j] == '1') {
swap(s[i], s[j]);
break;
}
}
} else {
ans++;
dig++;
num = 1;
if(dig >= ch + 1) {
ans++;
num++;
for(int j = len - 1; j > i; j--) {
if(s[j] == '1') {
swap(s[i], s[j]);
break;
}
}
} else {
dig++;
ans++;
}
}
}
}
} else {
num++;
}
}
//cout << s << endl;
printf("%d\n", ans);
}
return 0;
}