zoukankan      html  css  js  c++  java
  • noip2017 时间复杂度

    先吐槽

    题目我就不贴了

    很爆炸
    当时考试的时候觉得很简单
    然后就写啊写啊写
    然后发现好多细节啊
    emmm
    然后 调大样例还是调了很久....然后就
    哇 终于调过了!!!!!
    一直觉得过了一个很强的样例 心里很安心

    我tm len=strlen(s) 写成了 len-strlen(s) 都tm可以过样例
    这就是菜过分的下场

    Solution

    学长是用函数递归写的 我觉得栈好写 就用栈了
    无非麻烦一点就是 记录那个非法循环的时候 需要一点点小技巧
    当存在非法循环 不更新答案

    当然我代码还是很丑

    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <iostream> 
    #include <cstdio>
    #include <stack>
    #define maxn 2010
    #define re register
    using namespace std;
    
    char ch[1010];
    int ace,cnt,ans,tot;
    bool err=false,instack[30];
    
    stack<int>s,ss,sss;
    
    inline int get_ace(){
    	scanf("%s",ch+1);
    	int st=3,rtn=0;
    	if(isdigit(ch[st]))return 0;
    	else st=5;
    	while(isdigit(ch[st]))rtn=rtn*10+ch[st]-'0',st++; 
    	return rtn;
    }
    
    inline int get_letter(){
    	scanf("%s",ch+1);
    	return ch[1]-'a';
    }
    
    inline int get_num(char *s){
    	int st=1,rtn=0;
    	while(isdigit(s[st]))rtn=rtn*10+s[st]-'0',st++;
    	return rtn;
    }
    
    inline bool push_stack(){
    	bool fail=false,isnum1=true,isnum2=true;
    	int cur=get_letter(),num1,num2;
    	if(instack[cur])fail=true;
    	
    	scanf("%s",ch+1);
    	if(!isdigit(ch[1]))isnum1=false;
    	if(isnum1)num1=get_num(ch);
    	
    	scanf("%s",ch+1);
    	if(!isdigit(ch[1]))isnum2=false;
    	if(isnum2)num2=get_num(ch);
    	
    	if(fail)return false;
    	
    	if((!isnum1&&isnum2)||((isnum1&&isnum2)&&(num1>num2))){
    		s.push(cur);
    		instack[cur]=true;
    		ss.push(cnt);
    		sss.push(-1);
    		tot++;
    	}
    	
    	if((isnum1&&isnum2)&&num1<=num2||(!isnum1&&!isnum2)){
    		s.push(cur);
    		instack[cur]=true;
    		ss.push(cnt);
    		sss.push(0);
    	}
    	
    	if(isnum1&&!isnum2){
    		s.push(cur);
    		instack[cur]=true;
    		ss.push(++cnt);
    		sss.push(1);
    	}
    	return true;
    }
    
    
    inline bool pop_stack(){
    	if(!s.size())return false;
    	int cur=s.top();s.pop();
    	instack[cur]=false;
    	int pre_ans=ss.top();ss.pop();
    	int flag=sss.top();sss.pop();
    	if(flag==-1)tot--;
    	else if(tot==0&&flag==0)ans=max(ans,pre_ans); 
    	else if(tot==0&&flag==1)ans=max(ans,pre_ans),cnt--;
    	else if(flag==1)cnt--;
    	return true;
    }
    
    inline void pre_pare(){
    	err=false;
    	memset(instack,false,sizeof(instack));
    	ans=cnt=tot=0;
    	while(s.size())s.pop();
    	while(ss.size())ss.pop();
    	while(sss.size())sss.pop();
    } 
    
    int main(){
    	freopen("in.txt","r",stdin);
    	int T;scanf("%d",&T);
    	while(T--){
    		int n;scanf("%d",&n);
    		ace=get_ace();
    		pre_pare();
    		for(int i=1;i<=n;i++){
    			scanf("%s",ch+1);
    			if(ch[1]=='F'){
    				bool ok=push_stack();
    				if(!ok)err=true;
    			}
    			else if(ch[1]=='E'){
    				bool ok=pop_stack();
    				if(!ok)err=true;
    			}
    		}
    		if(s.size())err=true;
    		if(err)printf("ERR
    ");
    		else if(ace==ans)printf("Yes
    ");
    		else printf("No
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    .net 运行中出现的错误解决方法记录
    SVC 工作过程中出现的错误记录(SEO项目)
    TreeCollection2
    晴天前100页评论标签云分析显示
    python numpy数组中的复制问题
    Task多线程进行多进程
    python list(列表)和tuple(元组)
    并发无锁队列学习(概念介绍)
    关联型容器
    【原创】k8s源代码分析-----EndpointController
  • 原文地址:https://www.cnblogs.com/DexterYsw/p/7856512.html
Copyright © 2011-2022 走看看