NOIP 2017 时间复杂度

题目链接

https://www.luogu.org/problemnew/show/P3952

去年考试这道题貌似20分

今天又写,怒干1个半小时,一次AC

重点是静下心来,理清思路,知道要干什么

然后慢慢地查错

之后自己造一些比较难的数据来测

这种细节巨多的题就要静下来,就好了

 

 

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std;

int main()
{
    int T; 
    scanf("%d", &T);
    
    while(T--)
    {
        char s[50]; int L, num = 0, ok = 0;
        scanf("%d%s", &L, s);
        
        REP(i, 0, strlen(s))
        {
            if(isdigit(s[i])) num = num * 10 + s[i] - '0';
            if(s[i] == '^') ok = 1;
        }
        if(!ok) num = 0;
        
        int vis[30];
        memset(vis, 0, sizeof(vis));
        stack<int> st;
        int op = 0, cnt;
        int ans = 0, sum = 0;
        
        gets(s);
        _for(r, 1, L) 
        {
            gets(s); 
            if(ans == -1) continue; //ERR
            
            if(strlen(s) == 1) 
            { 
                if(op == 1 && --cnt == 0) op = 0;
                if(st.empty()) { ans = sum = -1; continue; }
                
                vis[st.top()] = 0; st.pop(); 
                sum = max(sum, ans);
                if(ans) ans--;
            }
            else
            {
                char s1[5], s2[5], s3[5]; 
                int k = 0, cnt1 = 0, cnt2 = 0;
                
                REP(i, 0, strlen(s)) //切下来 
                {
                    if(s[i] == ' ') continue;
                    if(i > 0 && s[i-1] == ' ') k++;
                    if(k == 1) s1[0] = s[i];
                    if(k == 2) s2[cnt1++] = s[i];
                    if(k == 3) s3[cnt2++] = s[i];
                }
            
                int id = s1[0] - 'a';
                if(vis[id]) { ans = sum = -1; continue; }
                else vis[id] = 1;
                st.push(id);
                
                if(op == 1) { cnt++; continue; } //不执行 
                
                if(s2[0] == 'n' && s3[0] == 'n') continue;//n n
                if(s2[0] != 'n' && s3[0] == 'n') { ans++; continue; }//1 n
                if(s2[0] == 'n') { op = cnt = 1; continue; } //n 1
                
                bool ok = 0;  //常数 
                if(cnt1 != cnt2) ok = cnt1 > cnt2;
                else 
                {
                    REP(i, 0, cnt1)
                        if(s2[i] != s3[i])
                        {
                            ok = s2[i] > s3[i];
                            break;
                        }
                }
                if(ok) op = cnt = 1; 
            }
        }
        
        if(sum == -1 || !st.empty()) puts("ERR");
        else printf("%s\n", sum == num ? "Yes" : "No");
    }
    
    return 0;
}

 

转载于:https://www.cnblogs.com/sugewud/p/9881099.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片微型计算机(MCU)经过多年的发展,在性能上有很大的进步,在型号上发展到上千种类,已经广泛应用于人类社会生活的各个领域。单片机课程已经成为高校计算机、自动化、测控以及电子信息工程等专业的重要课程。该课程是一门理论性和实践性都很强的课程,在实际教学中,应将理论教学和实验教学紧密结合。学生在掌握理论知识之余,必须通过编写程序、设计硬件电路、仿真、调试这一系列的实验过程,才能更好地掌握单片机的结构原理和应用技能。随着单片机及其接口技术的飞速发展,目前市场上供应的编程仿真实验资源并不能完全满足高校单片机课程教与学的需求,构建低成本、技术先进、源码公开的单片机编程仿真实验系统,对我国单片机课程的教学和单片机领域人才的培养具有重要的现实意义。 本论文结合目前教学中对单片机编程仿真实验系统的实际需求,采用模块化结构设计思想,精心设计和开发了单片机编程仿真实验系统。该单片机编程仿真实验系统由PC机端单片机编程控制软件和单片机编程仿真实验板两部分组成。PC机端的单片机编程控制软件可以自动检测到连接到单片机编程仿真实验板上的单片机,控制单片机编程器擦除、写入、读出、校验目标单片机ROM中的程序,以十六进制文件(.HEX文件)格式显示在控制界面内;单片机仿真实验系统能够把写入单片机的程序实时地运行,并呈现实际运行效果。单片机编程控制软件和单片机仿真实验板组成一个完整的单片机编程仿真实验系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值