P3952 时间复杂度

——————————————————————————————————————————————————

noip罕见的纯模拟题,细节还是很多的

虽然没有看题解,但也错了很多地方

1,Yes与YES

2,ERR与Err,这个真的毒瘤,一个全大写一个却不是

3,ERR后向栈中添加元素防止RE

4,最后判断栈空、

————————————————————————————————————————-

#include<bits/stdc++.h>
using namespace std;
int t,lne,flg[500],num[500];
char ch[100];
stack<int>st,bl;
int main()
{
    cin>>t;
    while(t--)
    {
        memset(flg,0,sizeof(flg));
        memset(num,0,sizeof(num));
        while(!st.empty())st.pop();
        while(!bl.empty())bl.pop();
        int tag=0,lj=0,tab=0,nowtab=0;
        cin>>lne>>ch;
        if(lne%2!=0)lj=1;
        if(ch[2]-‘0‘!=1)for(int i=4;i<strlen(ch)-1;i++)tag=tag*10+ch[i]-‘0‘;
        while(lne--)
        {
            char a,b;
            int cc=0,dd=0;
            cin>>a;
            if(a==‘F‘){
                cin>>b;
                cin>>ch;
                if(ch[0]<=‘9‘&&ch[0]>=‘0‘)for(int i=0;i<strlen(ch);i++)cc=cc*10+ch[i]-‘0‘;
                cin>>ch;
                if(ch[0]<=‘9‘&&ch[0]>=‘0‘)for(int i=0;i<strlen(ch);i++)dd=dd*10+ch[i]-‘0‘;
                if(flg[b-‘0‘])lj=1;
                if(!cc&&!dd)st.push(0);
                if(!cc&&dd)st.push(-1);
                if(!dd&&cc)st.push(1);
                if(dd&&cc){
                    if(cc>dd)st.push(-1);
                    else st.push(0);
                }
                flg[b-‘0‘]=1;
                bl.push(b-‘0‘);
            }
            if(a==‘E‘){
                if(st.empty()){
                lj=1;for(int i=1;i<=100;i++)st.push(i),bl.push(i);
                }
                int nc=st.top(),nb=bl.top(),val=num[nb];
                st.pop();
                bl.pop();
                flg[nb]=0;
                num[nb]=0;
                if(nc!=-1){
                if(st.empty())tab=max(tab,val+nc);
                else num[bl.top()]=max(val+nc,num[bl.top()]);
                }
            }
        }
        if(!st.empty())lj=1;
        if(lj)cout<<"ERR";
        else {
            if(tab==tag)cout<<"Yes";
            else cout<<"No";
        }
        cout<<endl;
    }
}

原文地址:https://www.cnblogs.com/SFWR-YOU/p/11391259.html

时间: 2024-10-09 19:50:27

P3952 时间复杂度的相关文章

【luogu P3952 时间复杂度】题解

对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problemnew/show/P3952 思路 对于每一个程序,先读入L和O(),并将其中的时间复杂度抠出来. 其次整行读入字符串,即所给定的程序. 判断第一个字符是F or E F i x y 需要把x y拿出来,把i压进栈 E 退栈 压进i后为了方便退栈及退栈时判断,用一个flag标记 每做完一个程序,与前

洛谷P3952 时间复杂度

题目:https://www.luogu.org/problemnew/show/3952 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确. A++语言的循环结构如下: F i x y 循环体 E 其中F i x y表示新建变量 i(变量 i 不可与未被销毁的变量重名)并初始化为 x, 然后判断 

洛谷 P3952 时间复杂度

做这道题的最大收获就是坚持不懈,勇往直前,这道题是一个"码力题",不能说无脑,但绝对恶心.总共花了3h+才调出来.果然当时NOIp放弃这道题是明智的 好了,闲话放一边,我们来搞一搞这道题. 这道题思路很简单,就是模拟.t<=10和L<=100也提示了我们时间不是问题,要大胆的去模拟.我是在线判断程序是否ERR,离线判断时间复杂度计算是否正确.如果程序ERR,就标记一下,输入完之后直接结束这次循环(continue),不再进行接下来的计算.至于判断Yes和No,我先将输入的时

luogu P3952 时间复杂度题解

显然这是一道大模拟 我们要做的就是读入一堆字符串,然后模拟这个循环. 定义某一层的复杂度为执行完这一层循环之后,消耗的复杂度. 某层循环的复杂度=\(max \{\)所有并列的下一层循环的复杂度\(\}\).通俗点说,就是在某层循环中有分支的时候,这一层的复杂度=\(max \{\)所有分支的复杂度\(\}+\)本层复杂度. 最后复杂度=\(max \{\)所有的第一层循环复杂度\(\}\) 考虑到会有分支,所以我们采用递归来实现(当然其本质是栈,但是我不会写). 由于要使程序不至于\(RE\)

在O(n)时间复杂度内找到出现超过一半的数

#include<iostream> using namespace std; bool solver(const int a[],const int n, int & num) { if(NULL == a || 0>= n) return false; ////注意,是小写~ int count = 0; int com = a[0]; for(int i = 1;i<n;i++) { if(0 == count) { com = a[i]; count++; } el

数据结构——时间复杂度

分析算法的时间复杂度: 算法的时间复杂度就是反应了程序执行时间随着输入规模增长而增长的量级,这个标准可以很好的反映出算法的优劣性质. 算法的频度: 一个算法执行所耗费的时间完全可以以程序执行的次数进行估算,程序执行的次数越多,时间复杂度也就越复杂,也就是说算法花费的时间与算法中语句执行的次数成正比例,因此,一个算法中语句执行的次数可以叫做时间频度.记为T(n). 时间复杂度: 由于n表示规模,当n不断变化的时候,T(n)也会随之不断变化,当我们需要知道他的变化趋势的时候,就要引入时间复杂度.一般

如何计算时间复杂度

本文是转载的,原作者不详. 一.概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f a ! =0时,时间复杂度就是O(2^n); a=0,b<>0 =>O(n^3); a,b=0,c<>0 =>O(n^2)依此类推 eg: (1) for(i=1;i<=n;i++) //循环了n*n次,当然是O(n^2) for(j=1;j<=

leetcode链表--13、median-of-two-sorted-arrays(两个排序数组的中位数,时间复杂度)

题目描述 There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 题目解析:本题关键之处在于时间复杂度要求为O(log(m+n)),本题如果采用合并并排序两数组的方式,时间复杂度为O((m+n)*log(n+m))但是在牛客网上

时间复杂度

一概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f a ! =0时,时间复杂度就是O(2^n); a=0,b<>0 =>O(n^3); a,b=0,c<>0 =>O(n^2)依此类推 二.计算方法 1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花