送分大赛

提交的地方

A

不是我的锅。。。

B

送分题

C

写法一:我也不知道哪里错了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 300;
int n,len,t,a,rt;
char c[N],tmp[5]={'{','[','(','<'},tr[5]={'}',']',')','>'};
bool flag,book[N];
inline int read()
{
	char c=getchar();
	int ans=0,w=1;
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	if(c=='-') { w=-1; c=getchar(); }
	while(c>='0'&&c<='9')
	{ ans=ans*10+c-'0'; c=getchar(); }
	return ans*w; 
}
/*void work(int l,int r)
{
	if(flag) return ;
	if(l+1==r) return ;
	int tt=l+1,aa=-1,rr=-1;
	while(tt<r)
	{
		for(int i=0;i<4;i++)
		if(c[tt]==tmp[i]) aa=i;
		if(aa<0) { flag=1; printf("NO\n"); return ;}
		for(int i=tt+1;i<r;i++)
		{
			if(c[i]==tr[aa]) { rr=i; break; }
			for(int j=0;j<4;j++)
			if((c[i]==tr[j]||c[i]==tmp[j])&&j<aa)
				break;
		}
		if(rr<0) { flag=1; printf("%d****%d\n*NO\n",l,r); return ;}
		work(tt,rr);
		tt=rr+1;
	}
}*/
int main()
{
	n=read();
	while(n--)
	{
		flag=0;
		memset(book,0,sizeof(book));
		cin>>c; 
		len=0; t=0; rt=-1; 
		while(c[len]) ++len;
		for(int i=0;i<len;i++)
		{ 
		    a=-1;
			for(int j=0;j<4;j++)
			if(c[i]==tr[j]) a=j;
			if(a<0) continue;
			for(int j=i-1;j>=0;j--)
			{
				if(j<0) break;
				for(int k=0;k<4;k++)
				if((c[j]==tr[k]||c[j]==tmp[k])&&k<a)
				{ break; }
				if(c[j]==tmp[a]&&!book[j]) { book[j]=1; book[i]=1; break; } 
			}
			if(!book[i]) { flag=1;break;}
		}
		if(flag) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

写法二:将所有的左括号放到一个栈里,每一个左括号进栈的时候,判断一下栈顶括号的下标是否大于当前括号(只判断相邻两个就行,不知道为啥从头判断会出错),满足条件才进栈,否则就是\(NO\)。如果当前是右括号,如果它和栈顶的括号不匹配,或者栈为空,就是\(NO\),如果合法,栈顶元素退栈。

错点:\(1.\)不要只把\(top\)清零,\(st\)数组也清一下,可能有想不到的地方会出错。
\(2.\)如果到最后栈中还有元素的话,也是不合法的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
int n,st[300],top,len,maxx,a;
char s[300],tr[5]={'1','{','[','(','<'};
char tm[5]={'1','}',']',')','>'};
map<char,int>mp;
bool flag;
int main()
{
//	mp['{']=1; mp['[']=2; mp['(']=3; mp['<']=4;
	scanf("%d",&n);
	while(n--)
	{
		flag=0;
		memset(st,0,sizeof(st));
		cin>>s; len=0; maxx=0; top=0;
		while(s[len]) ++len;
		for(int i=0;i<len;i++)
		{
			a=-1;
			if(flag) break;
//			for(int j=1;j<=top;j++)
//			{
//				if(st[j]<maxx) { flag=1; break;}
//				maxx=max(maxx,st[j]);
//			}
			if(flag) break;
			char t=s[i];
			for(int j=1;j<=4;j++)
			 if(t==tr[j]) { a=j; }
			if(a>0) 
			{
				if(st[top]<=a) st[++top]=a;
				else { flag=1; break; }
			}
			else
			{
				if(tm[st[top]]!=t||top<=0)
				 { flag=1;  }
				--top;
			}
		}
		if(flag||top) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

D

找规律题,当时着急随便找了找竟然对了。打表是个好东西!

E

之前自己推出来过归并排序之前的预处理,这次大意了,因为样例是有序的,被骗了,少排了一次序。(归并也写错了。。)
归并漏掉了:enter image description here
预处理的错误:
enter image description here

enter image description here

posted @ 2019-08-19 14:44  蟹蟹王  阅读(117)  评论(0编辑  收藏  举报