10.6数构(概念,优先队列复习,漏斗倒水时间期望,小木棍dfs,括号匹配,后缀表达式,PTA第三题)

news2024/12/23 14:33:21

选择应试

数据项是数据的最小单位

数据的逻辑结构与数据元素本身的内容和形式无关

带头结点的单循环链表中,任一结点的后继结点的指针域均不空

顺序存储结构的主要缺点是不利于插入或删除操作

顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式

如果元素个数已知,且插入删除较少的可以使用顺序结构,而对于频繁有插入删除操作,元素个数未知的,最好使用链式结构,

在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关

在具有头结点的链式存储结构中,头指针并非指向链表中的第一个元素结点,头指针指向的是头结点

链式存储的优点是插入、删除元素时不会引起后续元素的移动,缺点是只能顺序访问各元素

循环链表可以做到从任一结点出发,访问到链表的全部结点

在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的

链表中的每个结点可含多个指针域,分别存放多个指针。例如双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继的指针

环形队列中有多少个元素可以根据队首指针和队尾指针的值来计算

n个元素进队的顺序和出队的顺序总是一致的

栈和队列的存储方式,既可以是顺序方式,也可以是链式方式

对顺序栈进行进栈、出栈操作不涉及元素的前、后移动问题

循环队列也存在着空间溢出问题。

  1. 循环队列执行出队操作时会引起大量元素的移动。F

    解析:出队对队首指针进行操作就行。

  2. 在用数组表示的循环队列中,front值一定小于等于rear值。F

    解析:环形循环队列font的值有可能大于rear。

  3. 在n个元素连续进栈以后,它们的出栈顺序和进栈顺序一定正好相反。T

  4. 对于一个有N个结点、K条边的森林,不能确定它共有几棵树。F

    解析:设边的数目 EdgeNum, 树的数目为 TreeNum
    根据 NodeNum - 1 = EdgeNum(对每棵树而言)
    所以 (NodeNum1 - 1) + … + (NodeNumi - 1) = K
    即 N - TreeNum = K`

在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(rear-front+maxSize)%maxSize

在少用一个元素空间的循环队列(m为最大队列长度)是满队列的条件(B )。

A.rear==front    B.(rear+1)%m==front    

C.(rear+1)==front    D.front==(front+1)%m

循环队列队空条件:Q.front==Q.rear

循环队列队满条件:(Q.rear+1)%MAXQSIZE==Q.front

设固定容量的循环队列中数组的下标是0~N-1,其队头队尾指针分别为f和r(f指向队首元素的前一位置,r指向队尾元素),则其元素个数为___D___。

A. r-f

B. r-f-1

C. (r-f)%N+1

D. (r-f+N)%N

应当注意的是,循环队列中,应保持队头,队尾指针有其中之一是虚指,即不能都是实指

由两个栈共享一个数组空间的好处是节省存储空间,降低上溢出发生的机率

循环队列不会产生假溢出

若某循环队列有队首指针front和队尾指针rear,在队不空时出队操作仅会改变front

入队改变rear

漏斗倒满水的充满时间期望

  const int N = 1e6;
    struct node {
        double data;
        double sum;
        double wait;
        double ex;
        int pre;
        vector<int>child;
    }list[N];
    void link(int x, int y) {
        list[x].child.push_back(y);
    }
    int n;
    double sum1;
    void fuzhi(int i) {
        sum1 = 0;
        int len = list[i].child.size();
        for (int j = 0; j < len; j++) {
            sum1 += list[list[i].child[j]].sum;//得到这一层的所有权和
        }
        for (int j = 0; j < len; j++) {
            list[list[i].child[j]].wait = (sum1 - list[list[i].child[j]].sum) / 2.0 + list[i].wait;//减掉自己的权和就是剩下的权和
            list[list[i].child[j]].ex = list[list[i].child[j]].wait + list[list[i].child[j]].sum;
        }
        // cout << list[i].sum << " " << list[i].wait << " " << " " << list[i].ex << endl;
    }
    cin >> n;
    list[1].pre = 0;
    for (int i = 1; i <= n; i++) {
        cin >> list[i].data;
        list[i].sum = list[i].data;
    }
    for (int i = 1; i <= n - 1; i++) {
        int f, b;
        cin >> f >> b;
        list[b].pre = f;
        link(f, b);
    }
    for (int i = 1; i <= n; i++) {
        int p = list[i].pre;
        while (p != 0) {
            list[p].sum += list[i].data;
            p = list[p].pre;
        }
    }
    //cout << list[1].sum << " " << list[1].wait << " " << " " << list[1].ex << endl;
    list[1].ex = list[1].sum;
    queue<int>q;
    q.push(1);
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        fuzhi(cur);
        int len = list[cur].child.size();
        for (int i = 0; i < len; i++) {
            q.push(list[cur].child[i]);
        }
    }
    for (int i = 1; i <= n; i++) {
        //cout <<"编号 " << i << " 前驱结点 " << list[i].pre << "     " << list[i].sum << "+" << list[i].wait << "=" << list[i].ex << endl;
       // printf("%.2lf ", list[i].ex);
        cout << fixed << setprecision(2) << list[i].ex << " ";
    }

改错

1.括号匹配,

考虑左括号多,右括号少,而且左括号一直是符合条件的情况

所以最后一定是要判断栈是否为空的,而且是在flag成立的基础上

可以尝试只保留唯一正确时的输出判定if条件,其他都是错的

   string s;
    int n;
    cin >> n;
    while (n--) {
        cin >> s;
        stack<int>st;
        bool flag = true;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '{') {
                if (st.empty()) {
                    st.push('}');
                }
                else if (st.top() == '}') {
                    st.push('}');
                }
                else {
                    flag = false;
                    cout << "NO" << endl;
                    break;
                }
            }
            else if (s[i] == '[') {
                if (st.empty()) {
                    st.push(']');
                }
                else if (st.top() == '}' || st.top() == ']') {
                    st.push(']');
                }
                else {
                    flag = false;
                    cout << "NO" << endl;
                    break;
                }
            }
            else if (s[i] == '(') {
                if (st.empty()) {
                    st.push(')');
                }
                else if (st.top() == '}' || st.top() == ']' || st.top() == ')') {
                    st.push(')');
                }
                else {
                    flag = false;
                    cout << "NO" << endl;
                    break;
                }
            }
            else if (s[i] == '<') {
                if (st.empty()) {
                    st.push('>');
                }
                else if (st.top() == '}' || st.top() == ']' || st.top() == ')' || st.top() == '>') {
                    st.push('>');
                }
                else {
                    flag = false;
                    cout << "NO" << endl;
                    break;
                }
            }
            if (st.empty()) {
                flag = false;
                cout << "NO" << endl;
                break;
            }
            else if (s[i] != '{' && s[i] != '[' && s[i] != '(' && s[i] != '<') {
                if (s[i] == st.top()) {
                    st.pop();
                }
                else {
                    flag = false;
                    cout << "NO" << endl;
                    break;
                }
            }
        }
        if (flag&&st.empty()) {
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }
    }

2.后缀表达式求值

和括号匹配的整体思路一样,都是在On的时间复杂度内遍历,遇到不同的情况给出不同的解决方案或处理策略

遇到数字时,尝试一直向后,得到整个数字,最后再判断前面是否为负号,并入栈

遇到操作符时,出栈两个进行相应操作,如遇到负号且符号后面有数字则跳过,因为其不是操作符号

遇到空格就跳过

遇到#号就结束

3

对每天的数,只要不是最后一条都入队列,同时出队所有比它小的元素

用栈的思路就是,如果栈为空,就入栈;

如果不空,就要判断此时栈顶元素(先前买的价格)和现在的价格的大小

如果前者小,就一直删,直到删空或者遇到比现在大的

如果前者大,就直接入栈,不卖之前的

这样就能保证栈的元素总是能保持为每一天之后的最大股票价,因为小的已经都出去了

#include <iostream>
using namespace std;
#include <stack>
int main()
{
    long long N;
    cin>>N;
    long long expenditure=0;//总支出
    long long income=0;//总收入
    stack<long long>diminish;//股票从高到低排序的堆栈
    long long stock;//每天的股票价钱
    for(long long i=0;i<N-1;i++)//第1天到第N-1天
    {
        cin>>stock;
        expenditure+=stock;//除最后一天不买之外,其它天每天都买进且只买一支股票
        if(diminish.empty())//空
        {
            diminish.push(stock);
        }
        else if(diminish.top()>=stock)//非空且大
        {
            diminish.push(stock);
        }
        else if(diminish.top()<stock)//非空且小
        {
            while(!diminish.empty()&&diminish.top()<stock)//非空且小
            {
                income+=stock;
                diminish.pop();
            }
            diminish.push(stock);
        }
    }
    cin>>stock;//第N天
    while(!diminish.empty())//到最后一天还有没卖掉的,就全部出售。
    {
        income+=stock;
        diminish.pop();
    }
    cout<<income-expenditure<<endl;
    return 0;
}

优先队列的思路也同理,只不过换种说法 

#include<stdio.h>
#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include<cmath>
#include<queue>
#include<iomanip>
using namespace std;
//
int n, num;
long long pout = 0, pin = 0;
priority_queue<int, vector<int>, greater<int> >q;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> num;
        int cnt = 0;
        if (i != n) {
            while (!q.empty()) {
                if (num > q.top()) {
                    q.pop();
                    cnt++;
                }
                else {
                    break;
                }
            }
        }
        else {
            cnt = q.size();
        }
        pin += cnt * num;
        if (i != n) {
            pout += num;
            q.push(num);
        }
    }
    cout << pin - pout << endl;
    return 0;
}

优先队列复习 

 

默认为大顶堆,即顶端为最大的; 

小木棍1120

贪心思路是让最长的尽可能匹配上最小的

?但是应该是几根拼呢?

要假设一个最短长度,然后从最短长度往下开始搜索,这个最短长度最大应该从最大和次大的和开始,这样可以保证剩下的都没有必要超过

?怎么保证这样拼完之后的长度都相等?即搜索的方式是什么?

前者可以理解成搜索的限制条件,即结果的一个要求

?怎么判断当下长度能不能满足?

所有小木棍有一个长度和,最后拼成的大木棍的数量是一个整数,那么其长度自然是长度和/最后拼成的数量

最后拼成的数量=1,2……

拼成的数量越多,即越往后遍历(外层循环次数越多),大木棍长度越短

枚举的终点就是大木棍长度和最长的长度相等,再短就不可能了

为1时就是全都拼在一起,可能,即这些小木棍拼不出相同长度的大木棍

知道大木棍长度后就开始深搜,排好序从大到小开始,从左往右搜,遇到用过的就c,没用过时就和当前的大木棍剩余长度比比,看能不能拼上去,能就下一层,不能就接着往后,如果最终拼不成

?最终拼不成怎么办?回溯到哪?

就回溯到上一个用的木棍,不用那个木棍

由于存在相同长度的木棍,所以在回溯时不能简单的直接下标++,需要数据预处理,即找到这个长度木棍紧邻的下一个不同长度木棍的编号。

最后一个优化是,如果没拼成,就看此时剩余长度和一些量的关系,用这个长度的木棍还没拼成时,

如果剩余长度和这个木棍长度相同,即用这个木棍拼好了一个大木棍,但是后续的小木棍拼不出整数的大木棍,则说明建立在之前的这么选是不对的

如果剩余长度和大木棍长度相同,即在选第一个木棍时,第一个木棍肯定是要用的,但是在之前拼好的大木棍下,建立在之前的已经用过的剩余最长木棍下拼不出剩下的大木棍,则说明之前选的不对,使后续接着拼木棍遭到了困难,所以也要回溯

整体的思路就是外循环确定大木棍长度,然后小木棍按长度排序,开始搜索拼接,尝试拼成这个大木棍,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1067287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【juc】countdownlatch实现并发网络请求

目录 一、截图示例二、代码示例2.1 测试代码2.2 接口代码 一、截图示例 二、代码示例 2.1 测试代码 package com.learning.countdownlatch;import lombok.extern.slf4j.Slf4j; import org.springframework.web.client.RestTemplate;import java.util.Arrays; import java.uti…

基于SSM的药房药品采购集中管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【UE5 Cesium】15-Cesium for Unreal 加载本地地形

目录 一、加载全球无高度地形 二、加载区域DEM 效果 一、加载全球无高度地形 1. 先去如下网址下载全球无高度地形&#xff1a;Using a global terrain layer without height detail - #9 by RidhwanAziz - Cesium for Unreal - Cesium Community 下载后如下&#xff1a; 解…

【Spring Cloud系统】- Zookeer特性与使用场景

【Spring Cloud系统】- Zookeer特性与使用场景 一、概述 Zookeeper是一个分布式服务框架&#xff0c;是Apache Hadoop的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置…

华为云云耀云服务器L实例评测|Ubuntu 22.04部署edusoho-ct企培版教程 | 支持华为云视频点播对接CDN加速

华为云云耀云服务器L实例评测&#xff5c;Ubuntu 22.04部署edusoho企培版教程 1、选择购买 华为云耀云服务器L实例 简单上云第一步 2、选择你要安装的操作系统&#xff0c;例如 Ubuntu 22.04 server 64bit 3、然后支付订单就行了 4、华为云云耀云服务器L实例创建好之后&#x…

2023年台州市第三届网络安全技能大赛(MISC)—Black Mamba

前言&#xff1a;当时比赛没有做出来现在来复现一下 就当记录一下&#xff08;这个思路没想到&#xff09; Black Mamba&#xff1a; 一张图片 常规得分离&#xff0c;属性&#xff0c;LSB&#xff0c;盲水印等都尝试过 无果&#xff01; 考点&#xff1a;异或解密&#xff0…

一篇理解TCP协议

一、TCP协议概念。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。它主要用于在计算机网络中&#xff0c;通过建立可靠的通信连接来进行数据传输。 TCP协议的特点如下&#xff1a; 可靠性&#xf…

满足你甜食需求的葡萄酒是怎样的?

也许这是不言而喻的&#xff0c;但我们认为&#xff0c;如果没有一杯完美的葡萄酒来补充你最喜爱的菜肴的复杂风味&#xff0c;一顿美食就不完整。无论您是享用美味的葡萄酒作为开胃菜&#xff0c;还是搭配主菜&#xff0c;我们相信我们最喜爱的饮料是一餐中任何部分的完美补充…

ESP32设备驱动-TFT_eSPI显示中文

TFT_eSPI显示中文 文章目录 TFT_eSPI显示中文1、安装TFT_eSPI库2、创建字库3、生成字库头文件4、使用字库本文将详细介绍如何使用TFT_eSPI显示中文。 1、安装TFT_eSPI库 2、创建字库 TFT_eSPI字体工具使用Processing软件创建字体。 下载并安装Processing:https://processin…

css的gap设置元素之间的间隔

在felx布局中可以使用gap来设置元素之间的间隔&#xff1b; .box{width: 800px;height: auto;border: 1px solid green;display: flex;flex-wrap: wrap;gap: 100px; } .inner{width: 200px;height: 200px;background-color: skyblue; } <div class"box"><…

6-5 头插法创建单链表(C) 分数 10

struct Node* buildLinkedList(int* arr, int n) {//创建哨兵位struct Node* head (struct Node*)malloc(sizeof(struct Node));head->link NULL;struct Node* node NULL;for (int i 0; i < n; i){//循环创建每一个结点node (struct Node*)malloc(sizeof(struct Nod…

Android系统定制之监听USB键盘来判断是否弹出软键盘

一.项目背景 在设备上弹出软键盘,会将一大部分UI遮挡起来,造成很多图标无法看到和点击,使用起来不方便,因此通过插入usb键盘输入代替软键盘,但是点击输入框默认会弹出软键盘,因此想要插入USB键盘时,默认关闭软键盘,拔出键盘时再弹出,方便用户使用 二.设计思路 2.1…

Python大数据之PySpark(六)RDD的操作

文章目录 RDD的操作函数分类Transformation函数Action函数基础练习[Wordcount快速演示]Transformer算子 -*- coding: utf-8 -*-Program function&#xff1a;完成单Value类型RDD的转换算子的演示1-创建SparkContext申请资源2-key和value类型算子groupByKey[(b, <pyspark.res…

【Java】微服务——Gateway网关

目录 1.为什么需要网关2.gateway快速入门1&#xff09;创建gateway服务&#xff0c;引入依赖2&#xff09;编写启动类3&#xff09;编写基础配置和路由规则4&#xff09;重启测试5&#xff09;网关路由的流程图 3.3.断言工厂3.4.过滤器工厂3.4.1.路由过滤器的种类3.4.2.请求头过…

idea插件(free mybatis plugin)

安装&#xff1a; 由于我用的idea版本是2023的&#xff0c;所以搜出来的是Free MyBatis Tool,和Free MyBatis plugin是一样的 主要功能&#xff1a; 生成mapper xml文件 快速从代码跳转到mapper及从mapper返回代码 mybatis自动补全及语法错误提示 集成mybatis generator gui…

Java高级之反射

关于反射的举例&#xff1a; 示例代码&#xff1a;Fan.java package testFanShe;/*** author: Arbicoral* Description: 测试反射&#xff1a;* 成员变量&#xff1a;2个public&#xff0c;2个private* 构造器&#xff1a;4个public&#x…

HTML 笔记 表格

1 表格基本语法 tr&#xff1a;table row th&#xff1a;table head 2 表格属性 2.1 基本属性 表格的基本属性是指表格的行、列和单元格但并不是每个表格的单元格大小都是统一的&#xff0c;所以需要设计者通过一些属性参数来修改表格的样子&#xff0c;让它们可以更更多样…

yolov5 web端部署进行图片和视频检测

目录 1、思路 2、代码结构 3、代码运行 4、api接口代码 5、web ui界面 6、参考资料 7、代码分享 1、思路 通过搭建flask微型服务器后端&#xff0c;以后通过vue搭建网页前端。flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现…

防火墙-——iptables

目录 安全技术&#xff1a;&#xff08;市场上常见的防御&#xff09; 1.入侵检测机制 2.入侵防御 3.防火墙 4.防水墙 通信的五大要素和四要素 iptables 四个表 数据流程图 安装iptables iptables管理选项: 匹配条件 通用匹配规则 1.查看filter中的 INPUT表 2.清…

性能测试笔记

一、性能测试的概念 性能测试的概念 使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程 性能测试的目的 评估当前系统能力&#xff0c;出现性能bug后&#xff0c;优化性能&#xff1a;预测未来的性能需求是否满足 例如&#xf…