• NOIP2017 时间复杂度 大模拟


    本文作者MiserWeyte

    再写一道大模拟题。

    由于是限时写的,相当于考场代码,乱的一批。

    题目链接:P3952 时间复杂度


    先记几个教训:

    • 字符串形式的数字比较大小老老实实写函数,字典序都搞错几次了
    • 栈空的时候不但pop()会RE,top()访问栈顶也会RE
    • 数字以字符形式读入要考虑位数超过一位

    思路:

    1.我用的是在线做法。

    2.使用结构体存储一个循环体,包括变量名、起始与结束、是否与n有关、是否能够进入(这一点麻烦了,在栈里推入是否与n有关以及是否能够进入就行了)

    3.使用一个变量存储当前进入的层数(只记含n的),当压入一个“与n有关”时++,当弹出一个“与n有关”时--,取最大值

    4.使用一个bool存储当前循环是否能进入。当弹出一个不能进入的结构体时取消“不能进入”的状态(如果已在“不能进入”的状态,结构体不会被记作“不能进入”)

    源码:

    //MiserWeyte is now "mzWyt"
    #include <bits/stdc++.h>
    using namespace std;
    int n, tgt, rel, curr = 0, maxx;
    bool used[30];
    string tar;
    bool err, notin;
    struct sts{
    	char tpe, nam;
    	string sta, end; 
    	bool use, nin;
    };
    bool le(string a, string b){
    	if(a=="n" || b=="n" ) return false;
    	int numa = atoi(a.c_str());
    	int numb = atoi(b.c_str());
    	return numa > numb;
    }
    stack <sts> s;
    void init(){
    	err = false;
    	memset(used, 0, sizeof(used));
    	curr = 0;
    	maxx = 0;
    	notin = false;
    	while(s.size()) s.pop();
    }
    int main(){
    	int t;
    	cin >> t;
    	while(t--){
    		init();
    		cin >> n >> tar;
    		tgt = 0;
    		if(tar[2] != '1'){
    			for(int i=0; i<tar.length(); i++){
    				if(tar[i] >= '0' && tar[i] <= '9'){
    					tgt *= 10;
    					tgt += tar[i] - '0';
    				}
    			}
    		}
    		for(int i=0; i<n; i++){
    			sts temp;
    			cin >> temp.tpe;
    			if(temp.tpe == 'F'){
    				cin >> temp.nam ;
    				cin>> temp.sta; 
    				cin>> temp.end;
    				temp.use = false;
    				temp.nin = false;
    				if(used[temp.nam - 'a']){
    					err = true;
    //					break;
    				}
    				used[temp.nam - 'a'] = true;
    				if(notin){
    					s.push(temp);
    				}
    				else if(temp.sta == "n" && temp.end == "n") s.push(temp);
    				else if(temp.sta != "n" && temp.end == "n"){
    					temp.use = true;
    					curr ++;
    					maxx = max(maxx, curr);
    					s.push(temp);
    				}
    				else if((temp.sta == "n" && temp.end != "n") || le(temp.sta, temp.end)){
    					notin = true;
    					temp.nin = true;
    					s.push(temp);
    				}
    				else s.push(temp);
    			}
    			else{
    				if(s.empty()){
    					err = true;
    					continue;
    				} 
    				if(s.size() && s.top().use && !s.top().nin) curr --;
    //				cout << s.top().use;
    				if(s.size() && s.top().nin) notin = false;
    				used[s.top().nam - 'a'] = false;
    				if(s.size()) s.pop();
    				
    			}
    //			cout << "curr" << curr << endl;
    //			if(notin) cout << "NOTIN" << endl;
    		}
    		if(s.size()) err = true;
    		if(err) cout << "ERR
    ";
    		else{
    			if(maxx == tgt) cout << "Yes
    ";
    			else cout << "No
    ";
    //			cout << curr << endl;
    		}
    	}
    } 
    
  • 相关阅读:
    Install JDK In Ubuntu
    js初学—实现checkbox全选功能
    js初学—js全自定义单选框
    poj1679The Unique MST(次小生成树模板)
    hdu3486Interviewe(二分是错的)(ST算法RMQ + 判定上下界枚举)
    poj3974 Palindrome(Manacher最长回文)
    poj1734 Sightseeing trip(Floyd求无向图最小环)
    BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)
    2.2 logistic回归
    神经网络的火热
  • 原文地址:https://www.cnblogs.com/miserweyte/p/11856077.html
Copyright © 2020-2023  润新知