題目鏈接: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;
}