Parencodings

    题目大意:给你一个P序列,表示从左到右的右括号左边有多少左括号,求M序列。

    注释:M序列定义为每一个右括号左边最近的没有被之前的右括号匹配的括号之间,有多少已经匹配的括号队对。$1\le number for P\le 20$。

      想法:暴力模拟。我们定义dis[i]表示第i-1个右括号到第i个右括号之间有多少可以直接使用的左括号。

        然后我们从当前节点向之前查找,起一个dis大于0的将这个dis-1,并且输出M[i]=i-j+1.(i是当前右括号,j是dis不为0的编号)。

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[25];//P数组
int dis[25];
int val[25];//M数组
int main()
{
	int cases;
	scanf("%d",&cases);
	while(cases--)
	{
		//original();不用初始化,因为我们都是重新覆盖所有的数组
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)//其实这题可以在线处理,但是内存又不卡,离线得了
		{
			scanf("%d",&a[i]);
		}
		for(int i=1;i<=n;i++)
		{
			dis[i]=a[i]-a[i-1];//处理dis数组
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=i;j>=1;j--)//find,找到一个合法的dis,然后更新val数组
			{
				if(dis[j])
				{
					dis[j]--;
					val[i]=i-j+1;
					break;
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			printf("%d ",val[i]);
		}
		puts("");
	}
	return 0;
}

     小结:其实这是个大垃圾题,主要的目的是.... .... 哈哈,没错,我的分类还没有题,想先敲一道垫个底!