2016年专业408算法题

2023-05-16

文章目录

  • 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历年真题算法题解析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2016年专业408算法题 的相关文章

  • 红黑树的查找时间复杂度O(logn)

    红黑树查找时间复杂度 如果二叉排序树是平衡的 xff0c 则n个节点的二叉排序树的高度为Log2n 43 1 其查找效率为O Log2n xff0c 近似于折半查找 如果二叉排序树完全不平衡 xff0c 则其深度可达到n xff0c 查找效
  • Ubuntu16.04环境下STM32和ROS间的串口通信

    目录 前言介绍 lt 1 gt 最终协议的样子 lt 2 gt 本方案提供的API实现的功能 原理 lt 1 gt 简要叙述 lt 2 gt 这里是如何使用共用体的 xff1f 前期准备 lt 1 gt 确保硬件连接 lt 2 gt 查看串
  • C++版本OpenCv教程(三十五 )Laplacian算子

    上述的边缘检测算子都具有方向性 xff0c 因此需要分别求取X方向的边缘和Y方向的边缘 xff0c 之后将两个方向的边缘综合得到图像的整体边缘 Laplacian算子具有各方向同性的特点 xff0c 能够对任意方向的边缘进行提取 xff0c
  • 【从零开始学深度学习编译器】五,TVM Relay以及Pass简介

    TVM Relay以及Pass简介 0x0 介绍0x2 Relay介绍0x2 1 使用Relay建立一个计算图0x2 2 Module xff1a 支持多个函数 xff08 Graphs xff09 0x2 3 Let Binding an
  • 模型量化的原理与实践 —基于YOLOv5实践目标检测的PTQ与QAT量化

    这里写自定义目录标题 一 量化基础知识 1 1 Tops是什么意思 1 2 什么是定点数 1 3 定点数转换 1 4 什么是量化 1 5 定点计算 1 5 1 定点计算 误差计算 1 5 2 定点计算 内存对比 1 5 3 定点计算 速度对
  • TensorRT INT8量化说明文档

    TensorRT developer guide intro quantization 7 Working with INT8 7 1 Introduction to Quantization 7 1 1 Quantization Work
  • YOLO-NAS讲解

    Meet YOLO NAS New YOLO Object Detection Model Beats YOLOv6 amp YOLOv8 代码链接 What is YOLO NAS What does the NAS in YOLO NA
  • Windows下jupyter notebook的安装和使用

    1 安装 xff1a xff08 1 xff09 首先打开Windows命令终端 xff1a 输入命令 xff1a pip install jupyter notebook 慢慢等待安装完成就可以了 我的是已经是安装完成了 在命令行窗口中输
  • 无人驾驶模型预测控制carSIM和MATLAB联合仿真

    本例参照龚建伟的 无人驾驶车辆模型预测控制 书中第四章节 1 carSIM软件介绍 carSIM是由美国MSC公司开发的车辆动力学仿真软件 xff0c 它可以方便灵活地定义实验环境和试验过程 xff0c 准确预测和仿真汽车的操纵稳定性 动力
  • Ubuntu之间通过有线网sftp传输文件

    两台Ubuntu设备之间有线网直连 xff0c 通过sftp传输文件 xff1a 打开有线连接 xff0c 配置ipv4 xff0c 可参考下图 xff1a 两台Ubuntu设备使用同一个网关 xff0c 但是地址ip必须不同 xff0c
  • 虚拟机VMware15中安装Ubuntu18.04步骤

    先安装虚拟机VMware15 xff1a 下载地址 xff1a Windows 10 64位下载链接 xff1a pan baidu com s 1Q9MVsEzVVoeOb99lQ1tsVQ 提取码 xff1a dggh Windows
  • 机械手基础知识(2)之机械手的正运动学和逆运动学问题

    开篇总结 xff1a 机械手运动学是机器人控制中的重要研究内容 xff0c 得知机械手各关节变量的大小 xff0c 可以计算出机械手末端的位姿 xff0c 这个过程叫做机械手的正向运动学 xff1b 获得机械手末端在笛卡尔空间中的位姿 xf
  • 一看就懂的LSTM+Attention,此处用softmax求概率

    1 序言 首先 xff0c 我是看这两篇文章的 但是 xff0c 他们一个写的很笼统 xff0c 一个是根据Encoder Decoder和Query key value 第二个讲的太深奥了 xff0c 绕来绕去 xff0c 看了两天才知道
  • pytorch 保存模型+加载模型+修改部分层+冻结部分层+删除部分层

    pytorch的一些细节操作 本文以普通的CNN为例 1 实验用的模型 参考博客 2 模型代码 原始代码分成两个部分 xff1a 第一个是写CNN模型框架的py文件 xff0c cnn py 第二个是主文件 xff0c 用于下载数据和模型超
  • Windows下,Pytorch使用Imagenet-1K训练ResNet的经验(有代码)

    感谢中科院 xff0c 感谢东南大学 xff0c 感谢南京医科大 xff0c 感谢江苏省人民医院以的赞助 题记 只有被ImageNet真正殴打过一次才算是真的到了深度学习的坑边 xff0c 下一步才是入坑 引用装备所兰海大佬的一句话 xff
  • 实际的机械臂控制(8)使用find_object3D和Kinect2实现目标跟踪(基于python)

    单纯的炫耀我的新机械臂和留下联系方式 话不多说了 由于很多向入门机械臂的人不知道如何把视觉算法检测到目标坐标从图像坐标系转换到机器人坐标系 就这一关 xff0c 让好多人包括我 xff0c 在这块卡了很久 以前我用的是小强机械臂 xff0c
  • python生成pkl文件(pkl文件的读取和写入)

    我在训练UCF101数据集的时候 xff0c 遇到一个大高玩使用pkl文件 xff0c 一开始使用它们的数据炮的好好的 后来开始跑自己的数据时 xff0c 就出问题了 不知道这个pkl到底是个什么东西 原始的那个大高玩的ucf101的标签数
  • Pytorch(Python)中的itertools.count()函数

    在看深度强化学习DQN代码时 xff0c 遇到这段代码 xff0c 搞了好久都没看明白 完整代码参考这个博客 span class token keyword for span t span class token keyword in s
  • 深度强化学习算法调参

    深度强化学习调参技巧 xff1a 以D3QN TD3 PPO SAC算法为例 这个参考链接 如何选择深度强化学习算法 xff1f 参考链接 影响PPO算法性能的10个关键技巧 xff08 附PPO算法简洁Pytorch实现 xff09 主要
  • c语言连接多个字符串(strcat函数实现)

    span style font family KaiTi GB2312 font size 18px background color rgb 255 255 255 想要用c语言实现字符串的连接 xff0c 尤其是多个字符串的连接 xff

随机推荐