Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 23787 | Accepted: 13965 |
Description
S (((()()()))) P-sequence 4 5 6666 W-sequence 1 1 1456
Input
Output
Sample Input
2 6 4 5 6 6 6 6 9 4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6 1 1 2 4 5 1 1 3 9题目大意:规定两种括号的编码方式:1:每个数字表示该右括号左边有几个左括号 2::每个数组表示该右括号左边的第几个左括号与之匹配。给定编码1求编码2。
思路:开一个数组,0表示左括号,1表示右括号,先读入数据表示出括号的位置,然后对有个右括号寻找与之匹配的左括号,寻找时对匹配的左括号标记为-1.
技巧:读入一个数字时即可知道该括号所在的位置。
如4 5 6 6 6 6 中4可知第figure[4+0]为右括号1, 5可知figure[5+1]为右括号1。因为读入的数字表示左边有几个左括号,在加上前面的右括号数即可。
实现代码:
//************************************************************************// //*Author : Handsome How *// //************************************************************************// //#pragma comment(linker, "/STA CK:1024000000,1024000000") #include<cstdio> #include<cstring> #define fur(i,a,b) for(int i=(a);i<=(b);i++) #define furr(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; typedef long long LL; int figure[50]; int find(int a) { int dis = 1; for (a--; a >= 0; a--) { if (figure[a] == 0) { figure[a] = -1; break; } //标记退出 if (figure[a] == -1) { dis++; continue; } } return dis; } int main() { //freopen("E:\\data.in", "r", stdin); //freopen("E:\\data.out", "w", stdout); int T; int right[25]; //记录右括号的位置 scanf("%d", &T); while (T--) { int len; memset(figure, 0, sizeof(figure)); //先全部设置为左括号 scanf("%d", &len); fur(i, 0, len - 1) { scanf("%d", &right[i]); right[i] += i; figure[right[i]] = 1; } fur(i,0,len-1) printf("%d ",find(right[i])); printf("\n"); } return 0; }