这道题题目很长,想要弄清题意就得花点时间。当我第一次写完代码是发现,自己的代码连最后一个样例都过不了。囧!题目还有一个规定,如果n包含了j和k,那么j+k必须要小于n。如果没有这个规定的话,只需要开一个数组,分别从前和从后向中间匹配就ok了。
仔细观察,就会发现这道题就是括号匹配的加强版。
下面是代码:
#include<stdio.h>
#include<stack>
#include<cstdlib>
#include<iostream>
#define MAXN 10000005
using namespace std;
struct Type
{
int data;
int capacity;
};
Type T;
int a[MAXN];
int main()
{
int n=0,flag;
char c;
while(scanf("%d%c",&a[n++],&c)!=EOF)
{
if(c!='\n') continue;
stack<Type> s;
flag=1;
for(int i=0;i<n;++i)
{
T.data=a[i];
T.capacity=abs(a[i]);
if(a[i]<0)
{
if(i!=0&&s.empty())
{
flag=0;
break;
}
if(s.size()>=1)
{
if(s.top().capacity<=abs(a[i]))
{
flag=0;
break;
}
s.top().capacity-=abs(a[i]);
}
s.push(T);
}
else
{
if(s.empty())
{
flag=0;
break;
}
if(a[i]+s.top().data!=0)
{
flag=0;
break;
}
s.pop();
}
}
if(flag&&s.empty()) printf(":-) Matrioshka!\n");
else printf(":-( Try again.\n");
n=0;
}
return 0;
}
现在刷题很悲剧,有一大半的时间在语言上纠结,可见自己c++学的有多么的烂啊!花在思考的时间比在花在纠结于语言上的时间少太多了。囧啊!