【NOI-题解】1326. 需要安排几位师傅加工零件1228. 排队打水问题1229. 拦截导弹的系统数量求解

news2024/11/17 5:53:15

文章目录

  • 一、前言
  • 二、问题
    • 问题:1326. 需要安排几位师傅加工零件
    • 问题:1228. 排队打水问题
    • 问题:1229. 拦截导弹的系统数量求解
  • 三、感谢

一、前言

本章节主要对贪心问题进行讲解,包括《1326. 需要安排几位师傅加工零件》《1228. 排队打水问题》《1229. 拦截导弹的系统数量求解》题目。

二、问题

问题:1326. 需要安排几位师傅加工零件

类型:贪心


题目描述:

某工厂有 n 个零件加工的师傅,每位师傅每天能够加工出不同数量的零件。
现有 m 个零件要求一天加工完,请问该工厂最少需要派几个师傅来完成这次零件加工任务,如果安排所有的师傅都参与加工也不能在一天内完成任务,请输出NO。

输入:

第一行有两个整数,用空格隔开;
第一个整数代表要加工的总零件个数 m (m≤10^6),第二个整数代表工厂的零件加工师傅的数量 n(n≤100)。
第二行有 n 个整数,分别代表每个师傅每天能够加工出来的零件数量(每个师傅每天加工的零件数量≤10^4)。

输出:

输出工厂在 1 天时间内加工所有零件需要的师傅数量,或者输出NO。

样例:

输入:

10 5
1 3 2 4 2

输出:

4

在这里插入图片描述


1.分析问题

  1. 已知:总零件个数m,加工师傅的数量n,每个师傅每天能够加工出来的零件数量;
  2. 未知:该工厂最少需要派几个师傅来完成这次零件加工任务,如果安排所有的师傅都参与加工也不能在一天内完成任务,请输出NO。
  3. 关系:贪心。

2.定义变量

	//二、数据定义 
	int m,n,a[110],s=0; 

3.输入数据

	//三、数据输入
	cin>>m>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 

4.数据计算

  • 自定义比较函数,用于降序排序。
bool cmp(int a1,int a2){
	if(a1>a2){
		return true;
	}else{
		return false;
	}
}
  • 使用sort函数配合自定义的比较函数cmp对师傅的能力进行降序排序。
  • 接下来,遍历排序后的师傅列表,累加他们的日加工能力直到达到或超过总需求量m。
  • 一旦满足条件,立即输出师傅数量并跳出循环。
//四、数据计算 
	sort(a,a+n,cmp);
	
	for(int i=0;i<n;i++){
		s+=a[i];
		if(s>=m){
			cout<<i+1;
			break;
		}
		
	}

5.输出结果

  • 如果循环结束后累加的能力值s仍小于m,说明即使所有师傅都参与也不能一天完成任务,于是输出"NO"。
//五、输出结果 
	if(s<m){
		cout<<"NO";
	}
	return 0;	

完整代码如下:

#include<bits/stdc++.h> // 包含常用的C++库函数和数据结构
using namespace std; // 使用标准命名空间std,避免std::的前缀

// 自定义比较函数,用于降序排序
bool cmp(int a1, int a2) {
    if (a1 > a2) { // 如果a1大于a2
        return true; // 返回true,表示a1应排在a2前面
    } else {
        return false; // 否则返回false
    }
}

int main() {
    // 一、问题分析
    // 给定总零件数m,师傅数量n,及每个师傅的日加工能力,确定最少需要几位师傅完成任务,若不能一天完成则输出NO。

    // 二、数据定义
    int m, n, a[110], s = 0; // m: 总零件数, n: 师傅数量, a[]: 存储每个师傅的日加工能力, s: 当前累加的加工能力

    // 三、数据输入
    cin >> m >> n; // 输入总零件数m和师傅数量n
    for (int i = 0; i < n; i++) {
        cin >> a[i]; // 输入每个师傅的日加工能力
    }

    // 四、数据处理与计算
    sort(a, a + n, cmp); // 将师傅按日加工能力降序排序
    for (int i = 0; i < n; i++) {
        s += a[i]; // 累加当前师傅的加工能力到s
        if (s >= m) { // 如果累加的加工能力达到或超过了总需求
            cout << i + 1; // 输出当前已考虑的师傅数量(由于i从0开始,实际人数为i+1)
            break; // 达到条件,退出循环
        }
    }

    // 五、输出结果
    if (s < m) { // 如果累加的加工能力仍然小于总需求
        cout << "NO"; // 输出NO,表示无法在一天内完成任务
    }
    
    return 0; // 程序执行完毕,正常退出
}

问题:1228. 排队打水问题

类型:贪心


题目描述:

有 n 个人排队到r 个水龙头去打水,他们装满水桶的时间 t1​,t2​,…,tn​ 为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?
每个人打水的时间 = 排队的时间 + 实际打水的时间,本题假设一个人打好水,排在他后面的人接着打水的这个切换过程不消耗时间。
比如,有 2 个人 A 和 B ,他们打水的时间分别是 3 和 2 ,只有 1 个水龙头,这时,如果 A 先打水,B 后打水,那么 A 和 B 打水的时间分别为 3 、3+2( B 排队 3 分钟)。
因此,所有人打水的总时间就是每个人的打水时间及每个人的排队时间的总和。

输入:

第 1 行,两个整数n (1≤n≤500) 和 r (1≤r≤100)。
第 2 行,n 个正整数 t1​,t2​,…,tn​ ,(1≤ti​≤1000)表示每个人装满水桶的时间。

输出:

1 行,一个正整数,表示他们花费的最少总时间。

样例:

输入:

4 2
2 6 4 5

输出:

23

在这里插入图片描述


1.分析问题

  1. 已知: n个人,r个水龙头,每个人装满水桶的时间;
  2. 未知:花费的最少总时间;
  3. 关系:贪心。

2.定义变量

  • n: 人数。
  • r: 水龙头数量。
  • t[110]: 存储每个人装满水桶所需时间的数组。
  • s_time: 初始化最少总时间为0。
  • x: 临时变量,用于循环计算过程中的索引调整。
	//二、数据定义 
	int n,r,t[110],s_time=0,x;

3.输入数据

  • 读取人数 n 和水龙头数量 r。
  • 遍历输入每个人装水所需时间 t[i]。
	//三、数据输入 
	cin>>n>>r;
	for(int i=0;i<n;i++){
		cin>>t[i];
	}

4.数据计算

  • 使用 sort() 函数对时间数组 t[] 进行升序排序,确保先处理耗时短的人。
  • 遍历排序后的时间数组,前 r 个人直接累加他们的时间到 s_time,因为此时每个水龙头都能立即被使用。
  • 当超过 r 个人后,通过变量 x 回溯,每次回退 r 个位置并累加时间,模拟新一组人开始使用水龙头的过程。这样可以保证总是最短时间的人在有机会时优先使用水龙头
	//四、数据计算 
	sort(t,t+n);
	for(int i=0;i<n;i++){
		if (i<r){
			s_time+=t[i];
		}else{
			x=i;
			while(x>=0){
				s_time+=t[x];
				x-=r;
			}
				
		}
		
	}

5.输出结果

  • 输出最少总时间 s_time。
	//五、输出结果 
	cout<<s_time;
	return 0;

完整代码如下:

#include<bits/stdc++.h> // 引入标准库,包含常用的数据结构和算法
using namespace std; // 使用std命名空间,简化代码中的std::调用

int main(){ // 主函数开始
    // 一、问题分析
    // 已知:n个人需要用水龙头装满自己的水桶,总共有r个水龙头可用,
    // 每个人装满水桶所需时间不同(t[i])。目标是找到一种分配方案,
    // 使得所有人装满水桶的总时间最短。

    // 二、数据定义
    int n, r; // n: 人数, r: 水龙头数量
    int t[110]; // t[i]: 第i个人装满水桶所需的时间
    int s_time = 0; // s_time: 计算总的最短时间
    int x; // 辅助变量,用于计算累计时间时的索引调整

    // 三、数据输入
    cin >> n >> r; // 输入人数n和水龙头数量r
    for(int i = 0; i < n; i++){ 
        cin >> t[i]; // 输入每个人装满水桶所需的时间
    }

    // 四、数据计算
    // 首先对时间进行升序排序,使得时间短的人优先使用水龙头
    sort(t, t + n);

    // 遍历排序后的时间数组
    for(int i = 0; i < n; i++){
        // 前r个人直接累加他们的时间到总时间,因为此时每个水龙头都有人使用
        if (i < r){
            s_time += t[i];
        }else{
            // 当超过r个人后,每隔r个人的时间累加一次到总时间
            // 这样做是为了模拟新一波人开始使用水龙头的情况
            x = i; // 从当前索引开始
            while(x >= 0){
                s_time += t[x]; // 累加时间
                x -= r; // 跳回到可以再次累加的时间点(模拟新的一轮)
            }
        }
    }

    // 五、输出结果
    cout << s_time; // 输出最少的总时间
    return 0; // 程序成功执行结束
} // 主函数结束

问题:1229. 拦截导弹的系统数量求解

类型:贪心


题目描述:

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
假设某天雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入 n 个导弹依次飞来的高度(给出的高度数据是不大于 30000 的正整数),计算如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
比如:有 8 颗导弹,飞来的高度分别为
389 207 175 300 299 170 158 165
那么需要 2 个系统来拦截,他们能够拦截的导弹最优解分别是:
系统 1 :拦截 389 207 175 170 158
系统 2 :拦截 300 299 165

输入:

两行,第一行表示飞来导弹的数量 n(n≤1000);
第二行表示 n 颗依次飞来的导弹高度;

输出:

要拦截所有导弹最小配备的系统数 k 。

样例:

输入:

8
389 207 175 300 299 170 158 165    

输出:

2

在这里插入图片描述


1.分析问题

  1. 已知:n 枚导弹依序列飞行并报告其高度;
  2. 未知:确定拦截所有导弹最少需要配置的导弹拦截系统数量;
  3. 关系:每个拦截系统的首枚导弹能到达任意高度,但后续导弹不得高于前一枚。

2.定义变量

  • n: 导弹数量, a[]: 存储导弹高度, c: 系统计数器, s: 当前系统处理导弹的累加高度, temp: 记录局部最小高度。
  • isFind: 标志是否已找到所有导弹的处理方案
    // 数据定义
    int n, a[1010] = {}, c = 0, s = 0, temp = INT_MAX; 
    bool isFind = false; 

3.输入数据

  • 读取每个导弹的飞行高度
    // 数据输入
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i]; 
    } 

4.数据计算

  • 累加所有非零高度的值s,创建了一种机制来判断是否所有导弹都已被至少一个系统“覆盖”;
  • 通过比较,将符合条件的导弹高度设为0;
  • 当s不为0时,表明仍有导弹没有处理,需要增加系统;
  • 当s变为0时,表明所有导弹被标记为已处理(高度设为0)。

     while(!isFind) {
        temp = INT_MAX; // 初始化局部最小高度为极大值,象征“任意高度”
        
        // 遍历导弹高度,模拟每个系统处理导弹的过程
        for(int i = 0; i < n; i++) {
            if(a[i] == 0) continue; // 跳过已处理(高度设为0)的导弹
           
		    s += a[i]; // 累加当前系统处理的导弹高度总和
            
            // 更新局部最小高度,并标记该导弹为已处理
            if(temp > a[i]) {
                temp = a[i]; // 找到新的局部最小高度
                a[i] = 0; // 标记当前局部最小高度对应的导弹已由当前系统处理
            }
            
            
        }

        // 判断是否所有导弹都被考虑(通过累加和s)
        if(s == 0) {
            isFind = true; // 所有导弹均被至少一个系统覆盖
        } else {
            ++c; // 需要新的系统来处理剩余未被标记的导弹
            s = 0; // 重置累加和,准备下一轮迭代
        }
    }

5.输出结果

  • 最少需要的导弹拦截系统数量。
    // 输出结果
    cout << c; 

完整代码如下:

#include<bits/stdc++.h> 
using namespace std;
int main(){
    // 问题分析
    // 已知:n 枚导弹依序列飞行并报告其高度;
    // 目标:确定拦截所有导弹最少需要配置的导弹拦截系统数量;
    // 特殊规则:每个拦截系统的首枚导弹能到达任意高度,但后续导弹不得高于前一枚。

    // 数据定义
    int n, a[1010] = {}, c = 0, s = 0, temp = INT_MAX; // n: 导弹数量, a[]: 存储导弹高度, c: 系统计数器, s: 当前系统处理导弹的累加高度, temp: 记录局部最小高度
    bool isFind = false; // 标志是否已找到所有导弹的处理方案

    // 数据输入
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i]; // 读取每个导弹的飞行高度
    } 

    // 数据计算与系统分配
    while(!isFind) {
        temp = INT_MAX; // 初始化局部最小高度为极大值,象征“任意高度”
        
        // 遍历导弹高度,模拟每个系统处理导弹的过程
        for(int i = 0; i < n; i++) {
            if(a[i] == 0) continue; // 跳过已处理(高度设为0)的导弹
           
		    s += a[i]; // 累加当前系统处理的导弹高度总和
            
            // 更新局部最小高度,并标记该导弹为已处理
            if(temp > a[i]) {
                temp = a[i]; // 找到新的局部最小高度
                a[i] = 0; // 标记当前局部最小高度对应的导弹已由当前系统处理
            }
            
            
        }

        // 判断是否所有导弹都被考虑(通过累加和s)
        if(s == 0) {
            isFind = true; // 所有导弹均被至少一个系统覆盖
        } else {
            ++c; // 需要新的系统来处理剩余未被标记的导弹
            s = 0; // 重置累加和,准备下一轮迭代
        }
    }

    // 输出结果
    cout << c; // 最少需要的导弹拦截系统数量

    return 0; // 程序正常结束
}

思路二:

#include <bits/stdc++.h>
using namespace std;

// 变量声明
int a[1010]; // a 数组用来存储每个拦截系统能够拦截的导弹最大高度
int  n, x, p, k=0;

int main(){
    // 输入导弹总数
    cin >> n;

    // 循环读取每个导弹的高度
    for(int i = 1; i <= n; i++){
        cin >> x;

        // 初始化 p 为 -1,表示尚未找到合适的拦截系统
        p = -1;

        // 遍历已有系统(从1到k),尝试找到能够拦截当前导弹的系统
        for(int j = 1; j <= k; j++){
            // 如果当前系统 a[j] 的拦截高度大于等于导弹高度 x,则找到了合适的系统
            if(a[j] >= x){
                p = j; // 记录找到的系统索引
                break; // 跳出循环
            }
        }

        // 如果没有找到能够拦截当前导弹的系统(p 仍为 -1)
        if(p == -1){
            // 增加一个新的系统,即 k 自增,并将新系统的拦截高度设为当前导弹的高度
            k++;
            a[k] = x;
        }else{ // 如果找到了能够拦截的系统
            // 更新该系统能够拦截的最高高度为当前导弹的高度(可能降低,但题目允许)
            a[p] = x;
        }
    }

    // 输出最少需要的拦截系统数量
    cout << k;

    return 0;
}

三、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

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

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

相关文章

【嵌入式】探索嵌入式世界:在ARM上构建俄罗斯方块游戏的奇妙之旅

文章目录 前言&#xff1a;1. 简介2. 总体设计思路及功能描述2.1 设计思路2.2 功能描述2.3 程序流程图 3. 各部分程序功能及详细说明3.1 游戏界面函数3.1.1 游戏界面中的图片显示3.1.2 游戏开始界面3.1.3 游戏主界面3.1.4 游戏结束广告界面3.1.5 游戏界面中的触摸反馈3.1.6 游戏…

关于 Mybatis 的开启二级缓存返回对象不一致问题

做实验报告的时候&#xff0c;跟着学习&#xff0c;发现我已经将 开启 二级缓存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;说明对象不一致&#xff0c;二级缓存命中失败。 跟着流程配置&#xff1a; mybatis-config <settings><!-- 启用 myba…

mst[讲课留档]

最小生成树(Minimum Spanning Tree) (1)概念 我们知道&#xff0c;树是有 n n n个结点&#xff0c; n − 1 n-1 n−1条边的无向无环的连通图。 一个连通图的生成树是一个极小的连通子图&#xff0c;它包含图中全部的 n n n个顶点&#xff0c;但只有构成一棵树的 n − 1 n-1 …

实验五 计数器的设计与仿真

仿真 链接&#xff1a;https://pan.baidu.com/s/1N1nR39Gws59laVZY2slzBw 提取码&#xff1a;01ct 一、实验目的 1、通过实验&#xff0c;能熟悉QUARTUS开发环境&#xff0c;能够掌握VHDL设计电路&#xff0c;掌握使用相关仿真工具进行功能和时序仿真的方法&#xff1b; 2、通…

.js.map文件泄露/Springboot信息泄露

目录 框架识别 Webpack 简述 .js.map文件泄露 利用 Spring boot 很多网站都使用的是现有的框架进行开发的&#xff0c;因此相当于很多目录和文件的路径都是开源可知的&#xff0c;因此我们就可以直接访问对应的路径&#xff0c;如果网站没有进行限制就有可能会导致敏感信…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同&#xff0c;选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg&#xff0c;我用的还是旧的intel所以下载这个&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xff0c;如果mac用的是M1&#xff0…

Administrators就最高了???system是什么??本地用户提权内网学习第三天 你知道uac是什么??

我们今天来说说本地用户提权的操作&#xff0c;我们在有webshell过后我们要进行进一步的提权操作&#xff0c;要不然对我们后期的内网渗透会有一些阻碍的操作。比如说我们使用mimikatz来进行抓取密码&#xff0c;就不能够成功。 Administrators与system的区别 我们来说说Admin…

毫米波雷达深度学习技术-1.7训练一个神经网络

1.7 训练一个神经网络 对于训练神经网络&#xff0c;有两个步骤&#xff0c;即前向传递和误差反向传播。 1.7.1 前向传播和反向传播 在前向传递中&#xff0c;输入被馈送到模型并与权重向量相乘&#xff0c;并为每一层添加偏差以计算模型的输出。密集层或全连接层第l层的输入、…

微信小程序的运行机制与更新机制

1. 小程序运行机制 1.1. 冷启动与热启动 冷启动为用户第一次打开小程序时&#xff0c;因为之前没有打开过&#xff0c;这是第一种冷启动的情兑。第二种情况为虽然之前用户打开过&#xff0c;但是小程序被用户主动的销毁过&#xff0c;这种情况下我们再次打开小程序&#xff0…

西门子S120伺服驱动器F1910故障报警处理总结

西门子S120伺服驱动器F1910故障报警处理总结 热压机正常工作时出现故障,无上升和下降动作,伺服故障代码为1910, 同时发现压机的实际压力为13Mpa,没有达到设定的14Mpa, 查看S120的报警手册,如下图所示, F01910:现场总线设定值超时,与上位机控制器的通讯故障, 可能的原…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑复合指标优化模态分解和 Stacking 集成的综合能源系统多元负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

巴西东南湾乌巴图巴 ANTARES 监测站数据

ANTARES monitoring station in Ubatuba, Southeast Brazilian Bight 巴西东南湾乌巴图巴 ANTARES 监测站 简介 ANTARES 区域网络由分布在拉丁美洲的沿岸时间序列站组成。主要目的是研究气候和人为影响引起的长期变化&#xff0c;以及用于卫星匹配和算法开发的海洋颜色。Uba…

一分钟学习数据安全—自主管理身份SSI分布式加密密钥管理

在这篇之前&#xff0c;我们已经对SSI有了一个全局的了解。这个系列的文章可以作为一个学习笔记来参考&#xff0c;真正要实践其中的一些方案、协议&#xff0c;还需要参考专业的书籍和官方文档。作为一个SSI系列学习笔记的最后一篇&#xff0c;我们做一个简单的延伸&#xff0…

【PLC】三菱PLC如何和汇川伺服实现485通信

前言 一开始选用的是汇川SV660P脉冲型伺服&#xff0c;由于生产需求需要对伺服的个别参数进行读取和写入操作&#xff0c;但是SV660P并不支持这种情况&#xff0c;因此需要使用485通信来满足。PLC这边选用的是三菱FX5U。 开始 1、首先准备按照下图的引脚提示准备好一根带屏蔽…

(七)glDrawArry绘制

几何数据&#xff1a;vao和vbo 材质程序&#xff1a;vs和fs(顶点着色器和片元着色器) 接下来只需要告诉GPU&#xff0c;使用几何数据和材质程序来进行绘制。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…

英伟达经济学:云服务商在GPU上每花1美元 就能赚7美元

NVIDIA超大规模和 HPC 业务副总裁兼总经理 Ian Buck 近日在美国银行证券 2024 年全球技术大会上表示&#xff0c;客户正在投资数十亿美元购买新的NVIDIA硬件&#xff0c;以跟上更新的 AI 大模型的需求&#xff0c;从而提高收入和生产力。 Buck表示&#xff0c;竞相建设大型数据…

flask中解决图片不显示的问题(很细微的点)

我在编写flask项目的时候&#xff0c;在编写html的时候&#xff0c;发现不管我的图片路径如何变化&#xff0c;其就是显示不出来。如下图我框中的地方。 我尝试过使用浏览器打开&#xff0c;是可以的。 一旦运行这个flask项目&#xff0c;就无法显示了。 我查阅资料后。发现…

Kafka-时间轮和延迟操作-源码流程

TimingWheel 字段&#xff1a; buckets&#xff1a;Array.tabulate[TimerTaskList]类型&#xff0c;其每一个项都对应时间轮中的一个时间格&#xff0c;用于保存 TimerTaskList的数组。在TimingWheel中&#xff0c;同一个TimerTaskList中的不同定时任务的到期时间可能 不同&a…

【Dison夏令营 Day 06】用 Python 和 Rich 制作 Wordle克隆(中篇)

在大流行期间&#xff0c;Wordle 在 Twitter 上还算比较流行的一款基于网络的益智游戏&#xff0c;要求玩家每天在六次或更短时间内猜出一个新的五个字母的单词&#xff0c;每个人得到的单词都是一样的。 在本教程中&#xff0c;你将在终端上创建自己的 Wordle 克隆。自 2021 …

【Qt】认识Qt界面Hello world小程序

一.认识Qt界面 1.左边栏 在编辑模式下&#xff0c;左边竖排的两个窗⼝叫做 "边栏" 。 ① 是项⽬⽂件管理窗⼝ ② 是打开⽂件列表窗⼝。 边栏⾥的窗⼝数⽬可以增加&#xff0c;边栏⼦窗⼝标题栏有⼀排⼩按钮&#xff0c;最右边的是关闭按钮&#xff0c;倒数第⼆个是 …