ZOJ 3829 Known Notation
阿新 • • 發佈:2018-11-25
搞一手波蘭表示式。
顯然的策略:1.數字個數cnt必須大於等於*的個數數opt+1,cnt=opt+1時,前面放2個數字,後面*和數字交替放,這是極限了。
2.如果當前掃到的*號太多導致前面沒數字可算了,我們從儘可能後面的地方找數字和它交換,因為數字越前面越好,*號越後面越好,合法的可能性更大
所以就記錄一個當前前面的數字個數res,以及從後往前的指標numind,來從後往前找數字,因為每次交換要交換儘可能後面的數字。複雜度就是O(n)的了。
#include<bits/stdc++.h> #define maxl 1010 using namespace std; int n,opt,cnt,ans; char s[maxl]; inline void prework() { scanf("%s",s+1); n=strlen(s+1); opt=0;cnt=0; for(int i=1;i<=n;i++) if(s[i]=='*') opt++; else cnt++; } inline void mainwork() { int res; if(opt+1>cnt) ans=opt+1-cnt,res=opt+1-cnt; else ans=0,res=0; int numind=n; for(int i=1;i<=n;i++) if(s[i]=='*') { if(res>1) res--; else { while(s[numind]=='*') numind--; swap(s[numind],s[i]); numind--; res++;ans++; } } else res++; } inline void print() { printf("%d\n",ans); } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { prework(); mainwork(); print(); } return 0; }