原题地址
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int t;
cin>>t;
for (int i = 0; i < t; ++i) {
int n;
cin>>n;
vector<char>kuohao;
int temp = 0;
for (int j = 0; j < n; ++j) {
int a;
cin>>a;
for (int k = 0; k < a - temp; ++k) {
kuohao.push_back('(');
}
temp = a;
kuohao.push_back(')');
}
vector<char>::iterator it = kuohao.begin();
while(it!=kuohao.end()){
if(*it=='('){
it++;
continue;
}else{
int num = 1;
int counter = 1;
vector<char>::iterator itn = it-1;
while(num){
if(*itn=='(')num--;
else if(*itn==')'){
num++;
counter++;
}
itn--;
}
cout<<counter<<' ';
it++;
}
}
cout<<endl;
}
return 0;
}
题解和思路
这道题是很简单的模拟题了···首先根据给出的第一个序列把对应的括号序列给还原出来,具体方法是:
使用一个整形变量temp(初始值为0)存储当前最多的左括号数,与接下来输入的整数做差,得到的差值即为需要在栈顶推入的左括号的数目,如果相等则不推入。对于每个整数都必须在进行以上操作后推入一个右括号。重复上述步骤即可复原出来原始的括号序列
然后再根据括号匹配的方法,计算出W序列里面的整数:
当迭代器遇到右括号时,初始化两个整形变量用于存储需要匹配的右括号数目和右括号数目的计数器,让迭代器从右括号之前开始,向左不断匹配。当为右括号时,两个变量各自加一,当为左括号时,等待匹配数减一,直到匹配数为0时停止