pku 第一周训练——模拟

http://poj.org/problem?id=1068

给你一系列的左右括号的两个表示方法,p和W.然后是有P向W转换

Pi表示第i个右括号前边有几个左括号;

Wi表示第i个右括号如果要找匹配的话,要找从后往前数几个左括号与它匹配。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 25
using namespace std;
int fb[maxn],fw[maxn];//存储两种匹配
int ct[maxn],len[maxn];//记录长度,ct变而len不变
int main()
{
int n,i,j,sum,t;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i = 0; i < n; ++i)
scanf("%d",&fb[i]);
ct[0] = fb[0];
len[0] = ct[0];
for (i = 1; i < n; ++i)
{
ct[i] = fb[i] - fb[i - 1];
len[i] = ct[i];
}
for (i = 0; i < n; ++i)
{
if (ct[i])
{
fw[i] = 1;
ct[i]--;
}
else
{
sum = 0;
for (j = i - 1; j >= 0; --j)
{
if (ct[j])
{
sum += len[j] - ct[j] + 1;//从后往前找找到了还没有匹配的左括号
ct[j]--;
break;
}
sum += len[j] - ct[j];//还没找到
}
fw[i] = sum;
}

}
for (i = 0; i < n - 1; ++i)
printf("%d ",fw[i]);
printf("%d\n",fw[n-1]);
}
}



你可能感兴趣的:(pku)