注解
1、栈的应用。题目意思是给定每个右括号前面有几个左括号,让你输出每个右括号与对应的左括号之间的间隔的括号对的数目。
2、解决方法:每个位置对应一个数字,如(((()(()),则每个左括号依次对应的是数字1-4,6,7。将每个输入的字符,之前的左括号对应的数字都push到栈中。一旦读到右括号(也就是输入的右括号的位置),就先找到与它匹配的左括号,然后用(tmp-st.top()+1)/2;找到最终的答案。
代码
#include <iostream>
#include <stack>
using namespace std;
int main() {
int T;
cin>>T;
for(int i=0; i<T; i++){
int n;
cin>>n;
int a[n];
a[0] = 0;
for(int j=1; j<=n; j++){
cin>>a[j];
}
stack<int> st;
int now = 0;
for(int j=1; j<=n; j++){
int tmp = now + a[j]-a[j-1]+1;
for(int k=now+1; k<tmp; k++){
st.push(k);
}
int ans = (tmp-st.top()+1)/2;
now = tmp;
st.pop();
if(j==1){
cout<<ans;
}
else{
cout<<" "<<ans;
}
}
cout<<endl;
}
return 0;
}