2017提高组day1T2 时间复杂度 终于AC了,不容易啊不容易!

#include<bits/stdc++.h>

char st[110];//存储循环变量 
bool pd[110];//检测此循环是否为O(n) 
int T,n,deep;//deep:题目给出的复杂度 
int top,ans,Max;//top:存储栈栈顶指针 ans:记录当前复杂度 Max:最后的复杂度 
int limit,limitnum;//当存在x>y时,limit:记录位置 limitnum:记录复杂度 
int Err;//是否有错误 

int main(){
//	freopen("b.in","r",stdin);
//	freopen("b.out","w",stdout);
	
	int i,j;
	char s[10];
	
	scanf("%d",&T);
//	printf("%d\n",T);
	while (T--) {
		Err=0; top=0; limit=0; Max=0; ans=0;
		memset(pd,0,sizeof(pd));
		scanf("%d",&n);
		scanf("%s",s);
//		printf("%d %s\n",n,s);
		if (s[2]=='1') deep=0;
		else {
			deep=s[4]-'0';
			if (s[5]>='0' && s[5]<='9') deep=deep*10+s[5]-'0';
		}
//		printf("%d\n",deep);
		for (i=1;i<=n;i++) {
//			printf("%d\n",i);
			scanf("%s",s);
			if (s[0]=='E') {
				
				if (!limit) {if (ans>Max) Max=ans;}
				else if (limitnum>Max) Max=limitnum;
				if (pd[top]==1) {
					ans--;
					pd[top]=0;
				}
				top--;
				if (top==limit) limit=0;
				if (top<0) Err=1;
//				printf("top:%d ans:%d Max:%d limit:%d\n",top,ans,Max,limit);
				continue;
			}
			else {
				scanf("%s",s);
				int a=0,b=0;
				for (j=1;j<=top;j++) 
					if (st[j]==s[0]) {
						Err=1; break;
					}
				st[++top]=s[0];
				int p;
				scanf("%s",s);
				p=0;
				if (s[p]>='0' && s[p]<='9')
					while (s[p]>='0' && s[p]<='9') {
						a=a*10+s[p++]-'0';
					} 
				else {
					a=200;
				}
				scanf("%s",s);
				p=0;
				if (s[p]>='0' && s[p]<='9')
					while (s[p]>='0' && s[p]<='9') {
						b=b*10+s[p++]-'0';
					} 
				else {
					pd[top]=1;
					ans++;
					b=200;
				}
				if (a==b) {
					pd[top]=0;
					ans--;
				}
				if (a>b && !limit) {
					limit=top;
					limitnum=ans;
				}
			}
//			printf("top:%d ans:%d Max:%d limit:%d\n",top,ans,Max,limit);
		} 
		
		if (top!=0) Err=1;
		if (Err) printf("ERR\n");
		else if (Max==deep) printf("Yes\n");
		else if (Max!=deep) printf("No\n");
//		printf("%d %d %d %d\n",n,deep,Max,Err);
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值