解释和思路尽在代码中,不言说,细心体会
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int N = 20000;
int a[N]; //把左括号和右括号用01表示
int vis[N]; //表示看左括号是否被匹配过
int t, n;
int main()
{
cin >> t;
while (t--)
{
cin >> n;
memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));
int idx = 1; //表示括号的总数量的下标
int t = 0; //记录当先左括号的数目
for (int i = 0; i < n; i++)
{
int x; //每次输入左括号的数目,并匹配右括号
scanf("%d", &x);
if (x > t)
{
int temp = x - t; //计算当前的括号差值,找出左括号应有的数量
t = x; //更新t
while (temp--)
{
a[idx++] = 0; //左括号
}
}
a[idx++] = 1; //匹配右括号单个
}
for (int i = 1; i < idx; i++)
{
if (a[i] == 1) //找到了右括号
{
int cnt = 0; //匹配到的右括号的左括号数量
for (int j = i - 1; j >= 1; j--)
{
if (a[j] == 0 && vis[j])
cnt++;
else if (a[j] == 0 && !vis[j])
{
cnt++;
vis[j] = 1;
printf("%d ", cnt);
break;
}
}
}
}
cout << endl;
}
return 0;
}