K - Known Notation ZOJ - 3829[贪心]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38081836/article/details/83418968

题意:给出一个字符串(只含有数字和乘号),以及两种操作,分别为:

  1. 向该字符串中插入一个字符(数字或者乘号)
  2. 交换字符串中任意两个字符

回答最少需要几次操作能把字符串变成一个合法的后缀表达式。


题解:我们首先考虑如果乘号放在最后肯定是没有问题的,无论怎样只要有足够多的数字乘号一定能够用完。同理数字放在最前面也是可以的。根据上述理论贪心即可,如果该字符是乘号,那么判断他前面的运算数字的个数(多了不影响),如果不够的话将乘号与最后一个数字交换位置,如果没有数字那么就插入相应的字符。

数组开小竟然会TLE,心里难受 : ( :(


a c   c o d e : ac\ code:

/****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;
}

猜你喜欢

转载自blog.csdn.net/m0_38081836/article/details/83418968
今日推荐