11111 - Generalized Matrioshkas

题目:11111 - Generalized Matrioshkas


题目大意:判断给的一个序列是否满足下列的要求:

1,是否匹配,例如(-1, 1, 1, 1), (-1)这样不匹配。

2,是否能满足负数先与对应的正数输出,例如(1, -1, 1, -1)这样错误。

3,是否满足将要进栈的数大于栈顶元素。例如(-1, -2, 2,1)这样错误。

4,判断子序列中的孩子相加小于这个序列的首元素,例如(-3,-2,2,-1,1,3)因为这个子序列的孩子= 2+1 不小于3,所以错误。

解题思路:用一个栈来存放,负数进栈,正数如果加上栈顶的负数等于0就出栈(前提栈要不为空),如果不为0就不满足要求。还要判断第一个数如果是正数的话,就直接不满足要求。还要判断子序列的孩子是否小于子序列的首元素。(这里用计数的方法,每次当一个数要进栈时,就将栈顶元素先取下来,孩子的变量减去要进栈的数,标志这个数是我的孩子)。最后在判断栈空吗?不空空就不满足要求。这些要求都满足的就符合要求。


#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;

const int N = 10000001;
struct toy {
	
	int value;
	int childs;

}t[N];

stack <toy> st;
int main() {

	int len  = 0, i;
	char ch;
	while(scanf("%d%c", &t[len++].value, &ch) != EOF) {
	if(ch == '\n') {
		
		for(i = 0; i < len; i++)
			t[i].childs = 0;

		bool bo = 1;
		for( i = 0; i < len; i++) {

			if(t[i].value < 0 && (st.empty() || st.top().value < t[i].value)) {
				
				if(!st.empty()) {
					toy a;
					a.value = st.top().value;
					a.childs = st.top().childs - t[i].value;
					st.pop();
					st.push(a);
				
				}
				st.push(t[i]);
			
			}
			else if(!st.empty() && st.top().value > t[i].value) {
				bo  = 0;
				break;
			}
			else if(t[i].value > 0 && st.empty() != true) {

				if(st.top().value  + t[i].value == 0) {
					
					if(st.top().childs + st.top().value >= 0) {

						bo = 0;
						break;
					}
					st.pop(); 
					
				}
				else {
				
				}
					
			}
			else {
					bo = 0;
					break;
			}
		}
		if(!st.empty())
			bo = 0;
		if(bo)
			printf(":-) Matrioshka!\n");
		else
			printf(":-( Try again.\n");
		while(!st.empty())
			st.pop();
		len = 0;
		}
	}
	return 0;
}


你可能感兴趣的:(11111 - Generalized Matrioshkas)