问题:ParencodingsPOJ - 1068
序列如4 5 6 6 6 6表示第i个")"前面有几个"(",求序列如1 1 1 4 5 6,即与第i个")"相匹配的"("是其前面的第几个"("
分析:
模拟法,模拟写括号,匹配括号的过程即可得到答案
匹配过程:先读一个数num,然后把对应的"("都写上,相当于吧left[]填1填到num为止;然后开始从填的最后一位开始往前找1,找到1的同时记录往前走了几步,并把找到的1改为0,记录的步数作为答案保存起来,进入下一个数的输入,以此类推;但是要注于每一步的衔接,用now记录已经填到第几步,防止每次都从第一个开始填,用k取出开始找1的下标,不断k--直到找到1,同时利用counter记步数;特别注意代码里面的初始化是在哪里做的,这也是很重要的
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<queue> #include<map> #include<stack> #include<set> #include<bitset> #include<list> #define ll long long #define INF 0x3f3f3f3f #define EXP 1e-10 #define lowbit(x) (x&-x) using namespace std; int Left[50],ans[50]; int main(){ int n,m; cin>>n; while(n--){ memset(Left,0,sizeof(Left)); memset(ans,0,sizeof(ans)); cin>>m; int num; int now=1; for(int i=1;i<=m;i++){ cin>>num; for(;now<=num;now++){ Left[now]=1; } int counter=1,k=now-1; //cout<<"i: "<<i<<endl; //cout<<"k:"<<k<<" counter:"<<counter<<endl; while(Left[k]==0){ k--;counter++; } /*cout<<"k:"<<k<<" counter:"<<counter<<' '; cout<<"Left: "; for(int i=1;i<=num;i++){ cout<<Left[i]<<' '; } cout<<"ans: "; for(int i=1;i<=num;i++){ cout<<ans[i]<<' '; } cout<<endl;*/ Left[k]=0; ans[i]=counter; } for(int i=1;i<=m;i++){ cout<<ans[i]<<' '; } cout<<endl; } return 0; }