2016年专业408算法题

news2024/12/25 0:09:18

文章目录

  • 0 结果
  • 1 题目
  • 2 思路
    • 2.1 思路1(较优解:排序)
    • 2.2 思路2(最优解:类快排思想排序)
  • 附录

0 结果

较优解:
请添加图片描述
最优解:
请添加图片描述

1 题目

请添加图片描述

2 思路

为了使 | n 1 − n 2 | |n_1-n_2| n1n2尽可能小, S 1 − S 2 S_1-S_2 S1S2尽可能的大,则需要使划分的两个子集个数尽量想等,较小元素为一个子集,较大元素为一个子集。

2.1 思路1(较优解:排序)

根据前面的思路,对数组进行快速排序得到升序序列,前一个序列取 0 ∼ n / 2 − 1 0 \sim n/2-1 0n/21,后一个序列取 n / 2 ∼ n − 1 n/2 \sim n- 1 n/2n1

#include <cstdio>
#include <algorithm>

//快排
void Qsort(int A[], int L, int R){
    if(L >= R) return;
    int pivot, i = L, j = R;
    std::swap(A[L], A[rand()%(R - L + 1) + L]);//快排优化
    pivot = A[L];//比较的基准元素
    while(i < j){
        while(i < j && A[j] > pivot) j--;
        while(i < j && A[i] <= pivot) i++;
        if(i < j) std::swap(A[i], A[j]);
    }
    std::swap(A[L], A[i]);
    Qsort(A, L, i - 1);
    Qsort(A, i + 1, R);
}

void ans(int A[], int n){
    Qsort(A, 0, n - 1);
    //输出S1
    for(int i = 0;i < n/2;i++){
        printf("%d ", A[i]);
    }
    printf("\n");
    //输出S2
    for (int i = n/2; i < n; ++i) {
        printf("%d ", A[i]);
    }
    printf("\n");
}

int main(){
    int A[] = {1, 8,3, 6,5, 4,7,2};
    ans(A, sizeof (A)/sizeof (A[0]));
    return 0;
}

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( l o g n ) O(logn) O(logn)

2.2 思路2(最优解:类快排思想排序)

对数组 A [ 0 ∼ n − 1 ] A[0 \sim n-1] A[0n1]进行类似快速排序的做法,在处理左右区间时只处理可能包含中位数的区间,即如果区间的范围是 [ l , r ] [l, r] [l,r],则只有 l < = n / 2 − 1 < r l<=n/2-1<r l<=n/21<r才会处理该区间。

因为快排的基准元素元素左边一定小于等于基准元素,基准元素右边的一定大于等于基准元素,故如果中位数小于基准元素,则只对右边的部分继续排序,中位数大于基准元素,则只对左边的部分继续排序。含义如下图所示:
请添加图片描述

#include <cstdio>
#include <algorithm>

//快排
void Qsort(int A[], int L, int R,int n){
    if(L >= R) return;
    int pivot, i = L, j = R;
    std::swap(A[L], A[rand()%(R - L + 1) + L]);//快排优化
    pivot = A[L];//比较的基准元素
    while(i < j){
        while(i < j && A[j] > pivot) j--;
        while(i < j && A[i] <= pivot) i++;
        if(i < j) std::swap(A[i], A[j]);
    }
    std::swap(A[L], A[i]);
    //以下内容与原快排内容区别
    if(n/2 - 1 >= L && n/2 - 1 <= i - 1)// n/2-1在左区间范围中
        Qsort(A, L, i - 1, n);//递归处理左区间
    if(n/2 - 1 >= i + 1 && n/2 - 1 <= R)
        Qsort(A, i + 1, R, n);
}

void ans(int A[], int n){
    Qsort(A, 0, n - 1, n);
    //输出S1
    for(int i = 0;i < n/2;i++){
        printf("%d ", A[i]);
    }
    printf("\n");
    //输出S2
    for (int i = n/2; i < n; ++i) {
        printf("%d ", A[i]);
    }
    printf("\n");
}

int main(){
    //int A[] = {4, 1, 8,6, 3, 2, 5, 7};
    int A[] = {3,4,2,1,7,8,5,6};//最优解测试序列
    ans(A, sizeof (A)/sizeof (A[0]));
    return 0;
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( l o g n ) O(logn) O(logn)

附录

408历年真题算法题解析

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

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

相关文章

1.2.3存储结构:主存编址计算、主存编址的过程、存储单元、编址内容、存储总容量

1.2.3存储结构&#xff1a;主存编址计算、主存编址的过程、存储单元、编址内容、存储总容量主存编址的过程存储单元主存编址存储单元编址内容存储总容量例题主存编址的过程 计算机是一个机器&#xff0c;它能够识别的是机器语言&#xff0c;电器信号。因此计算机当中所有的数据…

英语学习 2

1 词汇积累 1、imply and infer 暗示和推断 2、indicate 显示、指出 3、outgoing 外向的 4、sympathy 同情心 5、sympathetic 有同情心的 6、evolution 进化 8、agreement 一致 10、resourceful 足智多谋的 11、appear 似乎 12、manufacturers 厂家、制造商 13、toilet paper …

linux定时器crond使用方式简介

文章目录一、简介二、cron.d下文件示例三、被调用的脚本文件四、检查脚本是否执行五、遇到的脚本未执行的情况一、简介 一般来说在/etc目录下&#xff0c;有5个以cron开头的目录&#xff0c;分别是/etc/cron.hourly&#xff0c;/etc/cron.daily&#xff0c;/etc/cron.weekly&a…

java泛型6

到底何时使用泛型方法&#xff1f;何时使用类型通配符呢&#xff1f;大多数时候都可以使用泛型方法来代替类型通配符。 这种场景下效果一样。 上面方法使用了泛型形式&#xff0c;这时定义泛型形参时设定上限&#xff08;其中E是Collection接口里定义的泛型&#xff0c;在该接…

搭建企业知识库的意义

当客户跟你达成合作关系后&#xff0c;需要持续的关系维护&#xff0c;在一定的销售点&#xff0c;定期和客户沟通&#xff0c;据调查&#xff0c;赢得一个新客户的成本可能是保留一个现有客户的5到25倍&#xff0c;作为营销策略&#xff0c;客户服务支持必须满足他们的期望。建…

Java---微服务---Seata的部署和集成

Seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务二、微服务集成seata1.引入依赖2.修改配置文件三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos配置一、部署Sea…

PEM格式RSA密钥解析(二)

PEM格式RSA密钥解析&#xff08;二&#xff09; RSA密钥参数解析 上一部分讲解了将Base64编码的密钥数据转换成hex格式数据&#xff0c;本章将介绍如何获从转码后的数据中获取RSA密钥的相关参数。 根据 RSA 密钥语法中的结构对私钥解析结果如下&#xff1a; 上一节转码后的私…

暗月ACK靶场 WP

环境搭建 https://mp.weixin.qq.com/s/VB4elHdrHNCmPDP_ktcLRg https://www.bilibili.com/video/BV1264y187St?spm_id_from333.1007.top_right_bar_window_history.content.click 按照文章拓扑根据实际情况搭建好&#xff0c;web2的其中一个网卡需要自己调一下ip 1、把 12s…

第五届字节跳动青训营 前端进阶学习笔记(十)Webpack基础

文章目录前言什么是Webpack1.Webpack概述2.Webpack基本使用Webpack打包核心流程1.webpack需要做的事情2.Webpack的使用3.处理CSS4.接入babel5.生成HTML6.HMR7.Tree-ShakingLoader1.Loader的主要特性2.常见Loader总结前言 课程重点&#xff1a; 什么是WebpackWebpack打包核心流…

本地启动打包后文件

本地启动打包后文件在 vs code 扩展中安装 Live Server配置 Live Server在 vs code 扩展中安装 Live Server 点击安装 Live Server 配置 Live Server VS Code setting.json 中配置 Vue/React 打包后文件夹 build/dist 为服务器的根目录 "liveServer.settings.root"…

AOP实例 – 环绕增强 日志记录

AOP实例 – 环绕增强 日志记录需求&#xff1a;记录图书的service层的日志操作&#xff0c;到数据库1. 创建商品日志记录表 Book_Log2. 完成日志记录表的插入逻辑3. 环绕增强搜集日志记录参数&#xff0c;并测试4. 环绕增强调用日志记录表的插入逻辑&#xff0c;完成日志记录功…

【目标检测论文解读复现NO.29】基于YOLO-ST的安全帽佩戴精确检测算法

前言此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;…

Spire.Barcode 5.1.0 for Java Patch

Spire.Barcode for Java是专门为开发人员设计的专业条码组件&#xff0c;用于在 Java 应用程序&#xff08;J2SE 和 J2EE&#xff09;上生成、读取和扫描 一维和二维条码。开发人员和程序员可以使用 Spire.Barcode 快速轻松地将企业级条码格式添加到他们的 Java 应用程序中。需…

【数字逻辑】逻辑函数式化简为其他形式

以 F&#xff08;A,B,C&#xff09;ABA‾CF&#xff08;A,B,C&#xff09; AB\overline{\rm A}CF&#xff08;A,B,C&#xff09;ABAC 为例&#xff0c;说明如何将与或式转换为其它类型的表达式。

CE认证和CCC认证区别?

CE认证和CCC认证区别? 参考链接:https://baijiahao.baidu.com/s?id=1728784934635704528&wfr=spider&for=pc CE认证和CCC认证有什么区别? 我发现我的很多朋友对此并不了解。 同时我发现很多产品在很多产品包装上都通过了CCC和CE认证,所以可能会引起没有做过产品…

硬件 -CPU工作原理

1.地址空间一个处理器能够访问&#xff08;读写&#xff09;的存储空间有限&#xff0c;我们称空间为地址空间&#xff0c;一般来说N位地址总线的处理器的地址空间是2的N次方。CPU从内存中取数据&#xff0c;先发地址&#xff0c;内存收到后&#xff0c;发送地址所在的数据。2.…

蓝奥声无线同步数据传输技术在物联网方面应用的优势

随着物联网技术的发展&#xff0c;其应用场景已经从简单的商品和服务扩展到广泛的社会和行业。当前&#xff0c;世界各地都在努力通过技术推动经济增长。对于许多行业来说&#xff0c;物联网技术的应用无疑将是一个新的增长机会。同时&#xff0c;物联网将推动社会结构从“制造…

Red Hat Linux 命令Crontab的使用方法

Red Hat Linux 命令Crontab的使用方法1 cron是一个linux下的定时执行工具&#xff0c;可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务&#xff0c;但它不自动起来&#xff0c;可以用以下的方法启动、关闭这个服务: /sbin/service crond start //启动服务 /…

C++的三大特性之继承

目录 一 继承的概念 代码&#xff1a; 总结&#xff1a; 二 继承中的关系 三 继承中的作用域问题 什么是域&#xff1f; 隐藏&#xff1a; 隐藏的场景&#xff1a; 总结 四 赋值兼容原则 什么是赋值兼容原则&#xff1f; 与平时强制类型转换的区别 这一个赋值兼容原则…

编译原理学习笔记18——语义分析和中间代码生成3

编译原理学习笔记18——语义分析和中间代码生成318.1 布尔表达式及其计算18.2 按数值表示法翻译布尔表达式18.3 带优化翻译布尔表达式18.1 布尔表达式及其计算 布尔表达式及其用途 计算布尔表达式的两种方法 计算布尔表达式的两种方法 18.2 按数值表示法翻译布尔表达式 数…