ZOJ Problem Set - 3829Known Notation(贪心)

ZOJ Problem Set - 3829Known Notation(贪心)

题目链接

题目大意:给你一个后缀表达式(只有数字和符号),但是这个后缀表达式的空格不幸丢失,现在给你一个这样的后缀表达式,问最少需要多少操作可以把这个表达式变成合法的。
操作:
1、在这个表达式的任何位置插入‘
’或者数字(一位数)。
2、把这个表达式的任何两个位置的字符对换。

解题思路:
一开始想的好复杂,结果还是漏了某种情况,一直过不去;就是卡在了碰到‘’的时候,数字不够是插入好还是替换好。
其实只要这么想:首先,数字的个数至少要是符号的个数 + 1.先求数字和符号的个数。数字不够插入自然更优,否则替换更好,并且插入数字在最越前面越好,替换‘
’替换在越后面越好。
注意:全部是数字的情况。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1005;
char str[maxn];

int main () {

    int T;
    scanf ("%d", &T);
    while (T--) {

        scanf ("%s", str);
        int num, op, ans;
        int len = strlen (str);
        ans = num = op = 0;

        for (int i = 0; i < len; i++)
            if (str[i] == '*')
                op++;
        num = len - op;
        if (!op) {
            printf ("0\n");
            continue;
        }

        if (str[len - 1] != '*') {

            ans++;
            for (int i = 0; i < len; i++)
                if (str[i] == '*') {
                    swap(str[i], str[len - 1]);
                    break;
                }
        }

        int cnt = 0;
        for (int i = 0; i < len; i++) {

            if (str[i] == '*') {

                if (cnt > 1)
                    cnt--;
                else {

                    if (num >= op + 1) {

                        for (int j = len - 1; j >= 0; j--)
                            if (str[j] != '*') {
                                swap(str[j], str[i]);
                                cnt++;
                                ans++;
                                break;
                            }

                    } else {

                        ans++;
                        num++;
                        if (!cnt) {
                            i--;
                            cnt = 1;
                        }
                    }
                }
            } else
                cnt++;
        }

        printf ("%d\n", ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值