这道题很简单,不过见过有人真的生成一个括号序列然后数的,实在没必要
我将左括号存1,右括号存-1,这样从右往左加,一旦和0说明已经闭合 ,其他很简单,没什么说的
就是这道题的输入输出方法是一次性全部输入存储,然后才计算,后来的题就改成输入一条算一条了,只是做这道题的时候不太晓得罢了,不同比赛中的题目输入输出要求的习惯也不太一样。
#include
<
iostream
>
using namespace std;
void Getwseq( int n, int p[])
{
int i;
int w[ 21 ]; // 目标w序列
int flag = 0 , countw,sum,start; // 标志
int sign[ 41 ]; // 1,-1序列,1--(左括号,-1--)右括号
for (i = 0 ;i < 41 ;i ++ )
{
sign[i] = 1 ;
}
int pos[ 21 ]; // 每个右括号的位置
w[ 1 ] = 1 ;
// 产生由1,-1表示的s序列
pos[ 1 ] = p[ 1 ] + 1 ;
sign[pos[ 1 ]] = - 1 ;
for (i = 2 ;i <= n;i ++ )
{
flag = p[i] - p[i - 1 ];
pos[i] = flag + pos[i - 1 ] + 1 ;
sign[pos[i]] = - 1 ;
}
// 按位计算w序列
for (i = 2 ;i <= n;i ++ )
{
sum = 0 ;
countw = 0 ;
start = pos[i];
do
{
sum += sign[start];
if ( - 1 == sign[start])
countw ++ ;
start -- ;
}
while (sum != 0 );
w[i] = countw;
}
// 输出w序列
for (i = 1 ;i <= n - 1 ;i ++ )
{
cout << w[i] << " " ;
}
cout << w[n];
}
int main()
{
int t = 0 ; // single integer t (1 <= t <= 10), the number of test cases
int n[ 11 ]; // n (1 <= n <= 20)
int pseq[ 11 ][ 21 ]; // pseq[i]存储第i组P序列数据
int i,j;
// 初始化数组为全0
for (i = 0 ;i <= 10 ;i ++ )
{
n[i] = 0 ;
for (j = 0 ;j <= 20 ;j ++ )
{
pseq[i][j] = 0 ;
}
}
// 录入数据
cin >> t;
for (i = 1 ;i <= t;i ++ )
{
cin >> n[i];
for (j = 1 ;j <= n[i];j ++ )
{
cin >> pseq[i][j];
}
}
// 计算W序列
for (i = 1 ;i <= t;i ++ )
{
Getwseq(n[i],pseq[i]);
cout << endl;
}
return 0 ;
}
using namespace std;
void Getwseq( int n, int p[])
{
int i;
int w[ 21 ]; // 目标w序列
int flag = 0 , countw,sum,start; // 标志
int sign[ 41 ]; // 1,-1序列,1--(左括号,-1--)右括号
for (i = 0 ;i < 41 ;i ++ )
{
sign[i] = 1 ;
}
int pos[ 21 ]; // 每个右括号的位置
w[ 1 ] = 1 ;
// 产生由1,-1表示的s序列
pos[ 1 ] = p[ 1 ] + 1 ;
sign[pos[ 1 ]] = - 1 ;
for (i = 2 ;i <= n;i ++ )
{
flag = p[i] - p[i - 1 ];
pos[i] = flag + pos[i - 1 ] + 1 ;
sign[pos[i]] = - 1 ;
}
// 按位计算w序列
for (i = 2 ;i <= n;i ++ )
{
sum = 0 ;
countw = 0 ;
start = pos[i];
do
{
sum += sign[start];
if ( - 1 == sign[start])
countw ++ ;
start -- ;
}
while (sum != 0 );
w[i] = countw;
}
// 输出w序列
for (i = 1 ;i <= n - 1 ;i ++ )
{
cout << w[i] << " " ;
}
cout << w[n];
}
int main()
{
int t = 0 ; // single integer t (1 <= t <= 10), the number of test cases
int n[ 11 ]; // n (1 <= n <= 20)
int pseq[ 11 ][ 21 ]; // pseq[i]存储第i组P序列数据
int i,j;
// 初始化数组为全0
for (i = 0 ;i <= 10 ;i ++ )
{
n[i] = 0 ;
for (j = 0 ;j <= 20 ;j ++ )
{
pseq[i][j] = 0 ;
}
}
// 录入数据
cin >> t;
for (i = 1 ;i <= t;i ++ )
{
cin >> n[i];
for (j = 1 ;j <= n[i];j ++ )
{
cin >> pseq[i][j];
}
}
// 计算W序列
for (i = 1 ;i <= t;i ++ )
{
Getwseq(n[i],pseq[i]);
cout << endl;
}
return 0 ;
}