zoj 3829

Known Notation

题意:添加字符或者交换字符使得构成合法的后缀表达式,求最少的操作次数。 


思路的中心思想:

数字尽量在前,星号尽量在后。


插入操作:

当数字不够,只需在字符串的前面插入数字即可

//假设我们需要插入号,必然因为前面的操作数过多,但是由于合并字符为数字的随意性,添加无非错误

交换操作:

当不满足条件时,交换操作字符和最后的数字。

对于字符串的遍历:
当遍历到某个位置时,如果统计得到的字符个数-数字个数>=1时,交换字符。
当最后以为不是*时添加操作字符。


[代码如下]

 
 
  1. /************************************************************************* 
  2.     > File Name: zoj3829.cpp 
  3.     > Author: cy 
  4.     > Mail: 1002@qq.com  
  5.     > Created Time: 14/10/13 18:48:56 
  6.  ************************************************************************/ 
  7.  
  8. #include<iostream> 
  9. #include<cstring> 
  10. #include <algorithm> 
  11. #include<cstdlib> 
  12. #include<vector> 
  13. #include<cmath> 
  14. #include<stdlib.h> 
  15. #include<iomanip> 
  16. #include<list> 
  17. #include<deque> 
  18. #include<map> 
  19. #include <stdio.h> 
  20. #include <queue> 
  21.  
  22. #define maxn 50000+5 
  23.  
  24. #define inf 0x3f3f3f3f 
  25.   #define INF 0x3FFFFFFFFFFFFFFFLL 
  26. #define rep(i,n) for(i=0;i<n;i++) 
  27.  #define reP(i,n) for(i=1;i<=n;i++) 
  28.  
  29. #define ull unsigned long long 
  30.  #define ll long long 
  31.  
  32. #define cle(a) memset(a,0,sizeof(a)) 
  33.  
  34. using namespace std; 
  35. string s; 
  36. int ans;//统计操作次数 
  37. int numop;//*号个数 
  38. int numn;//数字个数 
  39. int len; 
  40. void init() 
  41.     numop=0,ans=0,numn=0
  42.     int i; 
  43.     len=s.size(); 
  44.     for(i=0;i<len;i++){ 
  45.         if(s[i]>='0'&&s[i]<='9')numn++; 
  46.         else numop++; 
  47.     } 
  48. void doit() 
  49.     if(numn==len){ 
  50.         printf("0\n"); 
  51.         return
  52.     } 
  53.     if(numop>=numn){ 
  54.         ans=numop-numn+1
  55.         numn=numop-numn+1
  56.         numop=0
  57.     } 
  58.     else
  59.         numop=0;numn=0
  60.     } 
  61.     int ip=len-1
  62.     int i; 
  63.     rep(i,len){ 
  64.         if(s[i]=='*')numop++;else numn++; 
  65.         if(numop>=numn){ 
  66.             while(true){ 
  67.                 if(s[ip]>='0'&&s[ip]<='9')
  68.                     break
  69.                 } 
  70.                 else ip--; 
  71.             } 
  72.             swap(s[ip],s[i]); 
  73.             numn++; 
  74.             numop--; 
  75.             ans++; 
  76.         }     
  77.     } 
  78.     if(s[len-1]!='*')ans++; 
  79.     printf("%d\n",ans); 
  80. int main() 
  81. #ifndef ONLINE_JUDGE 
  82.      freopen("in.txt","r",stdin); 
  83.      //freopen("out.txt","w",stdout); 
  84. #endif 
  85.     int T; 
  86.     cin>>T; 
  87.     while(T--) 
  88.     { 
  89.         cin>>s; 
  90.         init(); 
  91.         doit(); 
  92.     } 
  93.     return 0
  94. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值