ZOJ 3829 Known Notation(贪心)

题目链接

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

思路 :当数字的个数比操作符的个数多的时候显然交换所用的操作次数少,只要把操作符往最后换即可。题目中隐含的意思是12你可以看成1和2也可以看成12,做题的时候注意灵活性。

当操作符的个数比数字的个数多的时候,显然插入数字才是正确的做法,只要往前插入即可。一个合法的逆波兰式的操作符的个数最多是数字的个数-1 。

#include <stdio.h>

#include <iostream>

#include <string.h>



using namespace std ;



int main()

{

    int n ;

    scanf("%d",&n) ;

    getchar() ;

    char ch[1100] ;

    while(n--){

        scanf("%s",ch) ;

        int len = strlen(ch) ;

            int opcnt = 0 ,numcnt = 0;

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

        {

            if(ch[i] == '*')

            {

                opcnt++ ;

            }

        }

        if(opcnt == 0)

        {

            printf("0\n") ;

            continue ;

        }

        int cnt = 0 ;//*前边的数字的数量

        int ans = 0 ;

        numcnt = len - opcnt ;

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

        {

            if(ch[i] == '*')

            {

                if(cnt > 1) cnt-- ;//只要前边有数字,*就要一直消耗掉,消耗不掉的看成一个数

                else

                {

                    if(numcnt > opcnt)//数字多,*往后换

                    {

                        for(int j = len-1 ; j >= 0 ; j--)

                        {

                            if(ch[j] != '*')

                            {

                                swap(ch[i],ch[j]) ;

                                cnt ++ ;

                                ans ++ ;

                                break ;

                            }

                        }

                    }

                    else

                    {

                        ans ++ ;

                        numcnt ++ ;//数不够,插入数字

                        if(cnt == 0)//字符串第一个是*的时候

                        {

                            i -- ;

                            cnt = 1 ;

                        }

                    }

                }

            }

            else cnt ++ ;

        }

        printf("%d\n",ans) ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(ZOJ)