• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

plank george

人生豪迈,只不过是重头再来。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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  阅读(302)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3