1603. 整数集合划分(2016年408数据结构算法题)

news2025/2/22 22:05:14

一、题目

1603. 整数集合划分icon-default.png?t=N7T8https://www.acwing.com/problem/content/description/1605/

二、算法的基本设计思想

由题意知,将最小的 \left \lfloor \frac{n}{2} \right \rfloor 个元素放在 A_{1} 中,其余的元素放在 A_{2} 中,分组结果即可满足题目要求。仿照快速排序的思想,基于枢轴将 n 个整数划分为两个子集。根据划分后枢轴所处的位置i分别处理:

① 若 i = \left \lfloor \frac{n}{2} \right \rfloor,则分组完成,算法结束;

② 若 i < \left \lfloor \frac{n}{2} \right \rfloor,则枢轴及之前的元素均属于 A_{1} ,继续对 i 之后的元素进行划分;

③ 若 i > \left \lfloor \frac{n}{2} \right \rfloor,则枢轴及之后的元素均属于 A_{2} ,继续对 i 之前的元素进行划分;

基于该设计思想实现的算法,无须对全部元素进行全排序,其平均时间复杂度是O(n),空间复杂度是O(1)

三、算法实现

#include <iostream>
#include <algorithm>
using namespace std;

int setPartition(int a[], int n) {
    int pivotkey, low = 0, low0 = 0, high = n - 1, high0 = n - 1, flag = 1, k = n / 2, i; //pivotkey保存枢轴元素值
    //low0,high0保存low,high的初值,避免丢失进行后续多轮的划分的位置定位
    int s1 = 0, s2 = 0; //记录A1、A2集合各自的和
    while(flag) {
        pivotkey = a[low]; //选择枢轴
        while(low < high) { //基于枢轴对数据进行划分
            while(low < high && a[high] >= pivotkey) --high; //若数组最右边的值比枢轴的值大,说明不需要调整,往左移动high继续比较即可
            if(low != high) a[low] = a[high]; //找到第一个比枢轴元素值小的元素,将其调整到前面
            while(low < high && a[low] <= pivotkey) ++low; //若数组最左边的值比枢轴的值小,说明不需要调整,往右移动low继续比较即可
            if(low != high) a[high] = a[low]; //找到第一个比枢轴元素值大的元素,将其调整到后面
        } //end of while(low < high)
        a[low] = pivotkey; //最后将枢轴放到两堆元素的中间
        if(low == k - 1) //如果枢轴是第n/2小元素,划分成功
            flag = 0;
        else{ //否则继续划分
            if(low < k - 1) { //枢轴及之前的元素均属于A1,继续对 low 之后的元素进行划分;
                low0 = ++low;
                high = high0;
            }
            else{ //否则枢轴及之后的元素均属于A2,继续对 low 之前的元素进行划分;
                high0 = --high;
                low = low0;
            }
        }
    }
    for(i = 0; i < k; i++) s1 += a[i]; //计算S1和
    for(i = k; i < n; i++) s2 += a[i]; //计算S2
    printf("%d %d", (n-k)-k, s2-s1);
    return s2-s1;
}


int main() {
    int n;
    cin>>n;
    int a[n];
    for(int i = 0;i < n; i++)
        cin>>a[i];
    setPartition(a,n);
}

四、关于快速排序

快速排序是一种常见且高效的排序算法,它基于分治的思想。它的基本思想是选择一个基准元素,然后将数组分为两个子数组,一个子数组中的元素都小于基准元素,另一个子数组中的元素都大于基准元素。然后对这两个子数组分别递归地进行快速排序,直到整个数组有序。

具体来说,快速排序的过程如下:

  1. 选择一个基准元素,通常是数组中的第一个元素。
  2. 将数组中小于基准元素的元素移到基准元素的左边,大于基准元素的元素移到基准元素的右边,基准元素放在中间。
  3. 递归地对基准元素左右两边的子数组进行快速排序。

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

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

相关文章

中南大学2021级云计算复习笔记

选择题 20分 10个 填空题 10分 10个 判断题 10分 5个 简答题 20分 4个 编程题 40分 2个 云计算基础 云计算的概念&#xff1a;云计算是一种商业计算模型。它将计算任务分布在大量计算机构成的资源池上&#xff0c;使各种应用系统能够根据需要获取计算力、存储空间和信息服…

(离散数学)命题逻辑推理一:直接推理

P说明这一行是前提&#xff0c;T说明这一行是结论 &#xff0c;I说明该结论是由推导而来&#xff0c;E说明该结论是由化简而来&#xff0c;括号里的数字是推导这一结论需要的条件序号。 这种写法只是将重言蕴含的论证的思路进行了梳理 &#xff0c;前件为真则后件为真、后件为假…

linux内核态内存泄漏检测-kmemleak

参考文章&#xff1a;Linux内核态内存泄漏检测工具--kmemleak工具原理及应用_linux 内存泄漏检测工具-CSDN博客 细说&#xff5c;Linux 内存泄漏检测实现原理与实现_内核_指针_信息 kmemleak原理&#xff1a;看网上说大概原理是在通过kmalloc&#xff0c;vmalloc&#xff0c…

Vue简单的表单操作

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

redis事务、管道及发布订阅

目录 redis事务 1、redis事务命令 2、示例 redis管道 1、管道命令 2、示例 redis发布订阅 1、发布者&#xff08;Publisher&#xff09; 2、订阅者&#xff08;Subscriber&#xff09; 3、示例 redis事务 在Redis中&#xff0c;事务是一组命令的有序队列&#xff0c…

Doris单机部署——2.0.1.1版本

目录 一、前期准备工作 1.设置系统最大文件打开句柄数 2.时钟同步 3.关闭每台机器的交换分区 4.下载安装包 二、单节点部署安装Doris (一)安装fe 1.解压改名 2.修改配置文件 3.创建元数据目录 4.启动fe 5.访问fe的webUI (二)安装be 1.进入be目录下&#xff0c;修…

Idea常用的快捷键

快捷键 快速生成main()方法&#xff1a;psvm&#xff0c;回车 快速生成输出语句&#xff1a;sout&#xff0c;回车 ctrlz撤回&#xff0c;ctrlshiftz取消撤回 ctrlr替换 CtrlAltspace(内容提示&#xff0c;代码补全等) ctrl句号。最小化方法&#xff0c;恢复最小化方法。 …

在我国干独立游戏开发有多难?

游戏独立开发在中国&#xff0c;一直以来都是一条充满挑战的道路。尽管有着无限的激情和创意&#xff0c;但面对市场、资金、政策等多方面的困难&#xff0c;许多独立开发者在这条路上艰难前行。 首先&#xff0c;市场竞争激烈是中国游戏独立开发者面临的首要挑战。随着游戏产…

单片机学习7——定时器/计数器编程

#include<reg52.h>unsigned char a, num; sbit LED1 P1^0;void main() {num0;EA1;ET01;//IT00;//设置TMOD的工作模式TMOD0x01;//给定时器装初值&#xff0c;50000,50ms中断20次&#xff0c;就得到1sTH0(65536-50000)/256;TL0(65536-50000)%256;TR01; // 定时器/计数器启…

单调栈类型题

搞定八道高频算法题 一、如何找右边第一个比我小的元素 二、如何找右边第一个比我大的元素 三、如何找右边最后一个比我小的元素 四、如何找右边最后一个比我大的元素 五、如何找左边第一个比我小的元素 六、如何找左边第一个比我大的元素 七、如何找左边最后一个比我小的元素 …

RESTful API 架构快速入门 Flask实现

RESTful 简介 1.1 为什么要使用 RESTful 架构&#xff1f; Representational State Transfer&#xff08;REST&#xff09;是一种面向资源的架构风格&#xff0c;广泛应用于网络服务的设计和开发。使用RESTful架构有以下几个优点&#xff1a; 简单性和可扩展性&#xff1a; RE…

Oracle(2-6) Backup and Recovery Overview

文章目录 一、基础知识1、Categories of Failures 故障类别2、Causes of Statement Failures 语句失败的原因故障情况Resolutions 决议 3、User Process Failures 用户进程失败故障情况Resolutions 决议 4、Possible User Errors 用户错误类型故障情况Resolutions 决议 5、Inst…

第六届 传智杯初赛B组

文章目录 A. 字符串拼接&#x1f37b; AC code B. 最小差值&#x1f37b; AC code C. 红色和紫色&#x1f37b; AC code D. abb&#x1f37b; AC code E. kotori和素因子&#x1f37b; AC code F. 红和蓝&#x1f37b; AC code &#x1f970; Tips&#xff1a;AI可以把代码从 j…

056-第三代软件开发-软件打包

第三代软件开发-软件打包 文章目录 第三代软件开发-软件打包项目介绍软件打包1 下载 linuxdepoyqt 工具2 安装 linuxdepoyqt3 qmake配置4 打包程序 总结 关键字&#xff1a; Qt、 Qml、 linuxdeployqt、 Ubuntu、 AppImage 项目介绍 欢迎来到我们的 QML & C 项目&…

自建CA实战之 《0x03 代码签名》

自建CA实战之 《0x03 代码签名》 本文针对Windows平台&#xff0c;介绍如何使用自建CA来签发代码签名证书。 之前的文章中&#xff0c;我们介绍了如何自建CA&#xff0c;以及如何使用自建CA来签发Web服务器证书、客户端证书。 本文将介绍如何使用自建CA来签发代码签名证书。…

坚鹏:中国人寿临沂公司当下中国经济形势与寿险业发展机遇培训

中国人寿保险&#xff08;集团&#xff09;公司属国家大型金融保险企业&#xff0c;2016年中国人寿入主广发银行&#xff0c;开启保险、投资、银行三大板块协同发展新格局。2022年&#xff0c;集团公司合并营业收入站稳万亿平台&#xff1b;合并总资产突破6万亿元大关。中国人寿…

基恩士软件的基本操作(五,日志记录与使用)

目录 基恩士是如何保存日志的&#xff1f; 如何使用日志功能 查看DM10的值1秒加1的记录日志 设定id与储存位置 软元件设定&#xff08; 日志ID有10个&#xff08;0~10&#xff09;&#xff0c;每一个ID最多添加512个软元件&#xff09; 设定触发 执行日志的梯形图程序 触…

Windows 7隐藏用户测试

请注意Window 7是在虚拟机上安装的&#xff0c;ip是192.168.0.108。 下边都是在虚拟机Window 7上操作&#xff0c;直到最后远程连接才在自己本机Windows 11上操作。 需要同时按下Windowsr,然后输入cmd&#xff0c;再点击确定。 在命令上里边输入net user可以显示一下用户。 …

单链表原来是这样实现的!

文章目录 前言1. 链表的概念及结构1.1在链表里&#xff0c;每节“车厢”是什么样的呢&#xff1f;1.2为什么还需要指针变量来保存下⼀个节点的位置&#xff1f; 2. 单链表的实现1. 定义结构体(Seqlist)2. 打印函数(SLTPrint)小插曲&#xff0c;创建节点函数CreateNode3. 尾插函…

一种LED驱动专用控制电路

一、基本概述 TM1620是一种LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU数字接口、数据锁存 器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热 水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、…