• PTA 7-6 盲盒包装流水线(单调栈)


    题目

    众所周知,PAT 有 9 枚徽章,分别对应青铜、白银、黄金、白金、钻石、大师、王者、大圣、天神这 9 个段位,只有成绩非常优秀的考生才有资格获得刻有自己名字的徽章。现在,PAT 制作了徽章的小型纪念版,要制成盲盒给大家玩了!

    下图是一条盲盒包装流水线的示意图。首先徽章通过进货口被压入货栈里,空盒在履带上从左向右传送。每次从货栈里弹出一枚徽章,进入打包机,装入一只空盒,打包后继续向右边传送。当货栈为空时,打包机会暂停,等待下一批徽章压入货栈。

    在这里插入图片描述

    每只盒子都有一个编号,小拼姐姐手里有进入流水线的空盒编号顺序表,也有每一批送往货栈的徽章顺序表,这样她其实可以知道每只盒子里装了哪种徽章。有些小朋友收到了盲盒,就想在拆封前问无所不知的小拼姐姐,盒子里的徽章是哪一种。但是因为盲盒总量有 10
    5
    这么多,小拼姐姐可记不住每只盒子里装的是什么,于是你就被请来写个程序帮小拼姐姐回复这种信息。

    输入格式:

    输入第一行给出 2 个正整数,分别为盲盒总量 N(≤105 )和货栈容量 S(≤100)。接下来一行给出 N 只盒子的编号,编号由 5 位数字组成,给出的顺序是空盒进入传送带的顺序。随后 N/S(保证是整数)行,每行给出一批 S 枚徽章的类型,为 1-9 的数字,给出的顺序是从进货口入栈的顺序。

    再下面给出一个正整数 K(≤104),为查询次数。随后 K 行,每行给出一个 5 位编号。

    输出格式:

    对每个查询编号,在一行中输出该盒子中装的徽章类型。如果编号是错误的,则在一行中输出 Wrong Number。

    • 输入样例:
    10 5
    00132 10093 92001 23333 66666 88888 09009 34658 82750 69251
    1 2 3 4 5
    9 8 7 6 1
    5
    66666
    88888
    69251
    55555
    10093
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 输出样例:
    1
    1
    9
    Wrong Number
    4
    
    • 1
    • 2
    • 3
    • 4
    • 5

    题解(第二版)(PTA平台大多java代码超时,只能用c++)

    #include
    
    using namespace std;
    
    const int N = 100010;
    const int S = 110;
    
    queue<int>q;
    int n, s, k,t;
    int arr[N];
    int a[N]={0};
    
    int main() {
        cin >> n >> s;
    
    
        for(int i=0;i<n;i++){
    		cin>>t;
    		q.push(t);
    	}	
        
        for(int i=0;i<n/s;i++){
    		stack<int>kt;
    		for(int j=0;j<s;j++){
    			cin>>t;
    			kt.push(t);
    		}
    		while(!kt.empty()){
    			a[q.front()]=kt.top();
    			kt.pop();
    			q.pop();
    		}
        }
        cin >> k;
    
        while (k--) {
            int temp;
            cin >> temp;
    
            if (a[temp] ==0) {
                cout << "Wrong Number" << endl;
            } else {
                cout << a[temp] << endl;
                }
            }
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    作者第一版使用的数组存徽章,没有使用第二版的栈,理应来说10000空间的数组不应该爆内存的,但是提醒我端错误,大佬如果懂可以讲讲为什么。
    
    • 1
    #include 
    #include 
    #include 
    
    using namespace std;
    
    const int N = 100010;
    const int S = 110;
    
    int n, s, k;
    int px = 1, py;
    int arr[N];
    int a[100000];
    
    int main() {
        cin >> n >> s;
        py = s;
    
        for (int i = 1; i <= n; i++) {
            int temp;
            cin >> temp;
            arr[i] = temp;
        }
        int tt=n/s+1; 
        int st[tt][s+1];
        
        for (int i = 1; i <= n / s; i++) {
            for (int j = 1; j <= s; j++) {
                cin >> st[i][j];
            }
        }
    
        for(int i=1;i<=n;i++){
            a[arr[i]]=st[px][py];
            py--;
            if(py==0){
                px++;
                py=5;
            }
        }
    
        cin >> k;
    
        while (k--) {
            int temp;
            cin >> temp;
    
            if (a[temp] ==0) {
                cout << "Wrong Number" << endl;
            } else {
                cout << a[temp] << endl;
            }
        }
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    在这里插入图片描述

    思路

    本题依然是使用单调栈的模拟题,大家细心处理即可。

  • 相关阅读:
    山石网科等级保护培训笔记
    【c++百日刷题计划】 ———— DAY13,奋战百天,带你熟练掌握基本算法
    java项目-第95期基于ssm的医院智能管理系统-java毕业设计
    GO学习注意
    2023下半年软考高级信息系统项目管理师考后解析
    实战案例(MDL语句)
    想做大模型开发前,先来了解一下MoE
    Springboot入门
    全网最简单解决方式1045-Access denied for user root@localhost(using password:YES)
    理解 Vue3 里的 defineProps 和 defineEmits
  • 原文地址:https://blog.csdn.net/qq_62235017/article/details/133753100