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;
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值