POJ Parencodings 括号序列
http://poj.org/problem?id=1068
作为一个数据不大的题目,打一个表,按照第一个序列把括号串直接模拟出来,然后按照题目说明一个个的输出第二个字符串就行了。
这是无脑的模拟,代码多,耗脑量小。当然也可以找第一个数列与第二个数列的规律,仅凭第一列数据输出第二列数据,这太要智商了,还是老老实实的模拟吧。
模拟算法:
#include<cstdio> #include<cstring> using namespace std; #define M 100000 #define mem0(f) memset(f,0,sizeof(f)) char s[M];//模拟出括号的情况,然后直接水掉 int t,n,p,x,xt,cou; int first,rights; int main() { scanf("%d",&t); while(t--) { p=0; xt=0; x=0; mem0(s); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&x); cou=x-xt; xt=x; for(int k=0;k<cou;k++) { s[p]=-1; p++; } s[p++]=1; } //for(int i=0;s[i];i++)printf("%d",s[i]);putchar('\n');//检验模拟,正确 //下面检验并输出第二个数组 first=1; for(int i=0;s[i];i++) { if(s[i]==1) { cou=0; rights=0; rights++; //开始回溯 for(int k=i-1;k>=0;k--) { if(!rights)break; if(s[k]==-1) { cou++; rights--; } else if(s[k]==1) { rights++; } } if(first){printf("1");first=0;}//这是处理输出行末没有空格的经典方法,先输出第一个数据然后剩下的数据每个数据输出前先输出一个空格 else printf(" %d",cou); } } putchar('\n'); } return 0; }
本来想在这里贴一个不是用模拟方法做的代码,但是在poj上找不到,在其他的地方也没有找到,那么大家也就不要念念不完另外的方法了,踏实点好,嘿嘿。
posted on 2013-07-29 11:34 plank george 阅读(297) 评论(1) 编辑 收藏 举报