您的位置:首页 > 其它

ZOJ 3829 (2014 牡丹江现场赛 K 题)

2014-10-16 18:45 274 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zoj