您的位置:首页 > 其它

POJ 1068 *** Parencodings

2015-11-15 15:12 330 查看
题意:对于一组无序的括号对(()())((()))而言,P数列描述‘)’前面的‘(’的数量,W数列描述与‘)’配对的最近的‘(’是第几个。输入数列P,求数列W。

要求:P数列长度小于20。

想法:数列中第i个数,如果与第i-1个数不同,则说明‘)’前面有一个‘(’,于是W[i]=1;第i个数与第i-1个数相同,则反复比较第i个数,与前面第k个数的差值,直到该差值大于遍历过的数的数目。

代码如下:
#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<sstream>
#include<set>
#include<string>
#include<iterator>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

int num[130];

int main() {
int n,t;
cin >> t;
while (t--) {
cin >> n;
num[0] = 0;
for (int i = 1; i <= n; ++i) {
cin >> num[i];
if (num[i] != num[i - 1])cout<<1<<" ";
else {
int res = 0,j = i - 1;
while ((j >= 0) && (num[i] - num[j] <= res)) {
++res;
--j;
}
cout<<res+1<<" ";
}
}
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: