ZOJ 3829 (2014 牡丹江現場賽 K 題)

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829


題意:判斷一個串用最小的步數變成RPN表達式。先是否爲RPN表達式,是直接輸出0,不是需經過2個變換,變爲RPN表達式。 RPN 表達式:   正常的式子是 操作數 * 被操作數   RPN是 操作數*被操作數。一個串可以爲多個RPN表達式,且只有操作數只有1到9,操作符值表示爲 * 。一個數字也可以爲一個RPN表達式。

變換:  1. 交換。任何2個字符都可以互相交換位置。

             2. 插入。串中的任何一個位置都可以插入一個字符(數字和*均可)。


解題思路: 分四種情況討論。1.當全爲數字輸出0。 2.當全爲 * 時輸出串的長度加1. 3. 設 * 的數量 s1,數字的數量 s2 ,當s2>=s1+1 4.s2<=s1;就很容易得出解。


AC代碼:

#include<stdio.h>
#include<string.h>

int main()
{
   int T,i,j,len,flag;
   int t1,t2,s1,s2,s;
   char str[1005],t;
   scanf("%d",&T);
   while(T--)
   {
      s1=s2=0;
      scanf("%s",str);
      len=strlen(str);
      for(i=0;i<len;i++)
      {
         if(str[i]=='*')
         s1++;
         else
         s2++;
      }
      if(s1==0)
      printf("0\n");
      else if(s2==0)
      printf("%d\n",s1+1);
      else if(s2>=s1+1)
      {
         s=t1=t2=0;
         for(i=0;i<len;i++)
         if(str[i]=='*')
         {
            if(t2<=t1+1)
            {
            for(j=len-1;j>i;j--)
            if(str[j]!='*')
            {
               t=str[j];
               str[j]=str[i];
               str[i]=t;
               s++;
               t2++;
               break;
            }
            }
            else
            t1++;
         }
         else
         t2++;
         printf("%d\n",s);
      }
      else
      {
         s=t1=t2=0;
         for(i=len-1;i>=0;i--)
         if(str[i]!='*')
         {
            if(t2<=t1)
            {
            for(j=0;j<i;j++)
            if(str[j]=='*')
            {
               t=str[j];
               str[j]=str[i];
               str[i]=t;
               s++;
               t2++;
               break;
            }
            }
            else
            t1++;//星號; 
         }
         else
         t2++;//數字; 
         printf("%d\n",s+s1-s2+1);
      }
   }
   return 0;
}








發佈了41 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章