2014 蓝桥杯 蚂蚁感冒

实质模型是括号配对问题,但是会不断的去掉两边的括号,同时变换内部括号。


模拟什么都行……


我的做法是离散化后再模拟,这样可以省事…… 因为是模拟比赛的样子在做题,所以程序特别丑,1Y, 这种水题也没啥得意的了。


真的需要讲解么----


离散化后得到    -1 1 -1 1 -1 1 1 1 1这样的序列


最左边-1,最右边的1先去掉, 然后只剩下1 -1 1 -1 1 1 1 , 出现1 -1连在一起的情况,就让他们一起变为-1 1即可。


#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
using namespace std;

int n;
map<int,int>G;

struct node
{
	int wz;
	int dir;
	int ganmao;
}a[200];
int b[200]={0}; 
int ganmao[200]={0};

int main()
{
	int tmp, flag;
	cin >> n;
	cin >> tmp;
	if (tmp > 0)flag = 1;
	else flag = -1;
	tmp *= flag;
	a[0].dir = flag;
	a[0].wz = tmp;
	a[0].ganmao = 1;

	
	for (int i = 1; i != n; ++ i)
	{
		cin >> tmp;
		if (tmp >0)flag=1;
		else flag = -1;	
		tmp *= flag;
		a[i].wz = tmp;
		a[i].dir = flag;	
		a[i].ganmao = 0;
	}

	for (int i = 0; i != n ; ++ i)
	{
		G[a[i].wz] = 0;
	}
	int count = 0;
	
	map<int , int >::iterator it;
	for (it = G.begin(); it!=G.end(); ++ it)	
	{
		it -> second = ++ count;
	}

	for (int i = 0; i != n; ++ i)
	{
		int now = G[a[i].wz];	
		b[now] = a[i].dir;
		ganmao[now] = a[i].ganmao;
	}


	int L = 1, R = count;
	int ans = 0;
	while (L <= R)
	{
		if (b[L]==-1)	
		{
			if (ganmao[L])	++ans;
			++L;		
		}
		if (b[R]==1)
		{
			if (ganmao[R])	++ans;
			--R;	
		}
		for (int i = L; i < R; ++ i)
		{
			if (b[i] == 1 && b[i + 1] == -1)		
			{
				b[i] = -1;
				b[i + 1] = 1;	
				ganmao[i] |= ganmao[i + 1];
				ganmao[i + 1] |= ganmao[i];
			}
		}
	}
	cout<<ans<<endl;
	
}


你可能感兴趣的:(2014 蓝桥杯 蚂蚁感冒)