C语言/C++自然序列重排列——相邻序号不相邻问题⭐

同类题目:C语言自然序列重排——相邻元素的差值集合恰好有 k 个不同的值。⭐⭐-CSDN博客

题目描述(难度⭐)

一场针对 n 学生的考试将在一个又长又窄的房间里举行,因此学生们将按某种顺序排成一行。老师怀疑相邻编号的学生(i 和 i + 1)总是坐在一起学习,并成为朋友,如果他们在考试时坐在一起,他们肯定会互相帮助。 你的任务是选择最大数量的学生,并安排这些学生在教室里坐下,使得没有两个相邻编号的学生坐在一起。

输入

单独的一行包含一个整数 n(1 ≤ n ≤ 5000)— 考试中的学生数量。

输出

在第一行打印整数 k — 可以就坐的最大学生数量,使得没有两个相邻编号的学生坐在一起。 在第二行打印 k 个不同的整数 a1, a2, ..., ak(1 ≤ ai ≤ n),其中 ai 是第 i 个位置上的学生编号。相邻位置的学生不能有相邻的编号。

具体来说,对于从 1 到 k - 1 的所有 i,应该满足下面的条件:|ai - ai + 1| ≠ 1。 如果存在多个可能的答案,则输出其中任意一个。

如果存在多个可能的答案,则输出其中任意一个。 

样例输入

6

样例输出

6
1 5 3 6 2 4

 样例输入

3

样例输出

2

1 3


解题思路:通过特殊处理n≤3的情况,以及对n>3的情况根据n的奇偶性分别安排学生座位,使得没有两个相邻编号的学生坐在一起,同时尽量安排最多数量的学生。 

具体思路

1.处理n≤3的特殊情况:

◦ 当n=1时,只有1个学生,直接输出1个学生,编号为1。

◦ 当n=2时,有2个学生,只能选择1个学生,输出1个学生,编号为1。

◦ 当n=3时,有3个学生,可以选择2个学生,输出2个学生,编号为1和3。  

2. 处理n>3的一般情况:

◦ 定义一个数组arr,用于存储学生的编号,数组大小为n+1,将学生的编号1到n依次存储到数组中。

◦ 当n为偶数时:

        ■ 可以安排所有n个学生坐下。输出学生数量n。

        ■ 通过循环,依次输出编号为i+n/2和i的学生(i从1到n/2),这样就能保证相邻编号的                学生不会坐在一起。在输出时,注意最后一个学生编号后面不加空格,直接换行。  

◦ 当n为奇数时:

        ■ 也可以安排所有n个学生坐下。输出学生数量n。

        ■ 通过循环,依次输出编号为i+n/2和i的学生(i从1到n/2),这样就能保证相邻编号的                学生不会坐在一起。

        ■ 最后单独输出编号为n的学生。 

代码实现 (C语言版)


#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);  // 输入学生总数n
    // 处理n≤3的特殊情况
    if(n<=3)
    {
        // 当只有1个学生时,直接输出1个学生,编号为1
        if(n==1) printf("1\n1\n");
        // 当有2个学生时,只能选择1个学生,输出1个学生,编号为1
        if(n==2) printf("1\n1\n");
        // 当有3个学生时,可以选择2个学生,输出2个学生,编号为1和3
        if(n==3) printf("2\n1 3\n");
        return 0;  // 结束程序
    }
    int arr[n+1];  // 定义一个数组存储学生的编号
    // 将学生的编号1到n依次存储到数组中
    for(int i=1;i<=n;i++)
    {
        arr[i]=i;
    }
    // 当n为偶数时,2*(n/2)=n
    if(n%2==0)
    {
        printf("%d\n",n);  // 可以安排所有n个学生坐下,输出学生数量n
        // 通过循环,依次输出编号为i+n/2和i的学生(i从1到n/2)
        for(int i=1;i<=n/2;i++)
        {
            // 如果不是最后一个学生对,输出编号后加空格
            if(i!=n/2)
            printf("%d %d ",arr[i+n/2],arr[i]);
            // 如果是最后一个学生对,输出编号后直接换行
            else
            printf("%d %d\n",arr[i+n/2],arr[i]);
        }
    }
    // 当n为奇数时,2*(n/2)=n-1
    else
    {
        printf("%d\n",n);  // 也可以安排所有n个学生坐下,输出学生数量n
        // 通过循环,依次输出编号为i+n/2和i的学生(i从1到n/2)
        for(int i=1;i<=n/2;i++)
        {
            printf("%d %d ",arr[i+n/2],arr[i]);
        } 
        printf("%d\n",arr[n]);  // 最后单独输出编号为n的学生
    }
    return 0;
}

(C++版) 

#include <iostream>
#include <vector>

int main() {
    int n;
    std::cin >> n;  // 输入学生总数n
    // 处理n≤3的特殊情况
    if(n <= 3) {
        // 当只有1个学生时,直接输出1个学生,编号为1
        if(n == 1) std::cout << "1\n1\n";
        // 当有2个学生时,只能选择1个学生,输出1个学生,编号为1
        else if(n == 2) std::cout << "1\n1\n";
        // 当有3个学生时,可以选择2个学生,输出2个学生,编号为1和3
        else if(n == 3) std::cout << "2\n1 3\n";
        return 0;  // 结束程序
    }
    std::vector<int> arr(n);  // 定义一个vector存储学生的编号
    // 将学生的编号1到n依次存储到vector中
    for(int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }
    // 当n为偶数时
    if(n % 2 == 0) {
        std::cout << n << std::endl;  // 可以安排所有n个学生坐下,输出学生数量n
        // 通过循环,依次输出编号为i+n/2和i的学生(i从1到n/2)
        for(int i = 0; i < n / 2; i++) {
            // 如果不是最后一个学生对,输出编号后加空格
            if(i != n / 2 - 1)
                std::cout << arr[i + n / 2] << " " << arr[i] << " ";
            // 如果是最后一个学生对,输出编号后直接换行
            else
                std::cout << arr[i + n / 2] << " " << arr[i] << std::endl;
        }
    }
    // 当n为奇数时
    else {
        std::cout << n << std::endl;  // 也可以安排所有n个学生坐下,输出学生数量n
        // 通过循环,依次输出编号为i+n/2和i的学生(i从1到n/2)
        for(int i = 0; i < n / 2; i++) {
            std::cout << arr[i + n / 2] << " " << arr[i] << " ";
        } 
        std::cout << arr[n - 1] << std::endl;  // 最后单独输出编号为n的学生
    }
    return 0;
}

 法二(更巧妙)

代码思路:根据输入的整数 n,输出一个特定的序列:当 n <= 2 时输出 1 1,当 n == 3 时输出 2 1 3,当 n > 3 时先输出 n,然后依次输出所有偶数和奇数。

代码一(时间复杂度O(n))

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

int main() {
    int n;
    cin >> n;  // 读取输入的整数 n

    // 处理 n <= 2 的情况
    if (n <= 2) {
        cout << 1 << endl;  // 输出 1
        cout << 1;        // 输出 1
    }
    // 处理 n == 3 的情况
    else if (n == 3) {
        cout << 2 << endl;  // 输出 2
        cout << 1 << " " << 3;  // 输出 1 3
    }
    // 处理 n > 3 的情况
    else {
        cout << n << endl;  // 输出 n
        // 输出所有偶数
        for (int i = 2; i <= n; i += 2) {
            cout << i << " ";
        }
        // 输出所有奇数
        for (int i = 1; i <= n; i += 2) {
            cout << i << " ";
        }
    }
    return 0;
}

代码二(时间复杂度为O(2*n)) 

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

int main() {
    int n;
    cin >> n;  // 读取输入的整数 n

    // 处理 n <= 3 的特殊情况
    if (n <= 3) {
        // 如果 n <= 2,输出 1 1
        if (n <= 2) {
            cout << 1 << endl << 1;
        }
        // 如果 n == 3,输出 2 1 3
        else {
            cout << 2 << endl << 1 << " " << 3;
        }
        return 0;  // 结束程序
    }
    
    // 创建一个大小为 n 的向量 arr,并初始化为 1, 2, 3, ..., n
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }
    
    // 输出 n
    cout << n << endl;
    
    // 必须先输出奇数,再输出偶数
    // 先输出偶数再输出奇数会有特例,例如 n = 4 时,输出 2 4 1 3,不符合条件
    // 先输出奇数
    for (int i = 1; i < n; i += 2) {
        cout << arr[i] << " ";
    }
    // 再输出偶数
    for (int i = 0; i < n; i += 2) {
        cout << arr[i] << " ";
    }

    return 0;  // 结束程序
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于机器学习随机森林算法的个人职业预测研究

1.背景调研 随着信息技术的飞速发展&#xff0c;特别是大数据和云计算技术的广泛应用&#xff0c;各行各业都积累了大量的数据。这些数据中蕴含着丰富的信息和模式&#xff0c;为利用机器学习进行职业预测提供了可能。机器学习算法的不断进步&#xff0c;如深度学习、强化学习等…

【王树森搜索引擎技术】概要01:搜索引擎的基本概念

1. 基本名词 query&#xff1a;查询词SUG&#xff1a;搜索建议文档&#xff1a;搜索结果标签/筛选项 文档单列曝光 文档双列曝光 2. 曝光与点击 曝光&#xff1a;用户在搜索结果页上看到文档&#xff0c;就算曝光文档点击&#xff1a;在曝光后&#xff0c;用户点击文档&…

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求&#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息&#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…

告别繁琐编译!make和makefile的便捷之道

Linux系列 文章目录 Linux系列前言一、make/makefile是什么&#xff1f;二、make/makefile的使用2.1、语法规则2.2、依赖关系和依赖方法2.3、清理可执行文件2.4、执行依据 三、循环依赖问题总结 前言 上一篇博客给大家分享了在Linux下编译源代码的两个工具&#xff0c;gcc和g…

【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行

OpenHarmony LiteOS-M基于Qemu RISC-V运行 系列文章目录更新日志OpenHarmony技术架构OH技术架构OH支持系统类型轻量系统&#xff08;mini system&#xff09;小型系统&#xff08;small system&#xff09;标准系统&#xff08;standard system&#xff09; 简介环境准备安装QE…

C语言初阶习题【29】杨氏矩阵

1. 题目描述——杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N); 2. 思路 3. 代码实现1 #include<stdio.h>void fin…

Cloud Foundry,K8S,Mesos Marathon弹性扩缩容特性对比

一、Cloud Foundry 使用Scaling an Application Using App Autoscaler插件&#xff0c;基于资源使用情况触发简单扩缩容 CPU、内存、Http带宽、延时等 监控这些资源的使用情况决定扩缩容策略&#xff1a;实例是增加还是减少 Instance Limits 限制实例数量范围&#xff0c;定义…

中职网络建设与运维ansible服务

ansible服务 填写hosts指定主机范围和控制节点后创建一个脚本&#xff0c;可以利用简化脚本 1. 在linux1上安装系统自带的ansible-core,作为ansible控制节点,linux2-linux7作为ansible的受控节点 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…

【BUUCTF】[GXYCTF2019]BabySQli

进入页面如下 尝试万能密码注入 显示这个&#xff08;qyq&#xff09; 用burp suite抓包试试 发现注释处是某种编码像是base编码格式 MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 可以使用下面这个网页在线工具很方便…

迅为瑞芯微RK3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)...

可应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等。iTOP-3562开发板/核心板采用瑞芯微RK3562处理器&#xff0c;内部集成了四核A53Mali G52架构&#xff0c;主频2GHZ&#xff0c;内置1TOPSNPU算力&#xff0c;RK…

蓝桥杯单片机基础部分——5、DS18B20温度传感器

前言 好久没有更新关于蓝桥杯单片机相关的模块了&#xff0c;今天更新一下数字温度传感器DS18B20的相关应用 单线数字温度计DS1820介绍 DS1820数字温度计提供9位(二进制)温度读数&#xff0c;指示器件的温度。信息经过单线接口送入DS1820 或从 DS1820 送出&#xff0c;因此从…

python爬虫入门(实践)

python爬虫入门&#xff08;实践&#xff09; 一、对目标网站进行分析 二、博客爬取 获取博客所有h2标题的路由 确定目标&#xff0c;查看源码 代码实现 """ 获取博客所有h2标题的路由 """url "http://www.crazyant.net"import re…

nginx 配置代理,根据 不同的请求头进行转发至不同的代理

解决场景&#xff1a;下载发票的版式文件&#xff0c;第三方返回的是url链接地址&#xff0c;但是服务是部署在内网环境&#xff0c;无法访问互联网进行下载。此时需要进行走反向代理出去&#xff0c;如果按照已有套路&#xff0c;就是根据不同的访问前缀&#xff0c;跳转不同的…

EI Scopus双检索 | 2025年第四届信息与通信工程国际会议(JCICE 2025)

会议简介 Brief Introduction 2025年第四届信息与通信工程国际会议(JCICE 2025) 会议时间&#xff1a;2025年7月25日-27日 召开地点&#xff1a;中国哈尔滨 大会官网&#xff1a;www.jcice.org 由黑龙江大学和成都信息工程大学主办&#xff0c;江苏科技大学协办的2025年第四届信…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…

STM32 FreeRTOS 任务挂起和恢复---实验

实验目标 学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用&#xff1a; start_task:用来创建其他的三个任务。 task1&#xff1a;实现LED1每500ms闪烁一次。 task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键按下逻辑&#xff0c;KE…

YOLO系列代码

Test-Time Augmentation TTA (Test Time Augmentation)是指在test过程中进行数据增强。其思想非常简单&#xff0c;就是在评测阶段&#xff0c;给每个输入进行多种数据增广变换&#xff0c;将一个输入变成多个输入&#xff0c;然后再merge起来一起输出&#xff0c;形成一种ens…

《自动驾驶与机器人中的SLAM技术》ch4:基于预积分和图优化的 GINS

前言&#xff1a;预积分图优化的结构 1 预积分的图优化顶点 这里使用 《自动驾驶与机器人中的SLAM技术》ch4&#xff1a;预积分学 中提到的散装的形式来实现预积分的顶点部分&#xff0c;所以每个状态被分为位姿&#xff08;&#xff09;、速度、陀螺零偏、加计零偏四种顶点&am…

docker 部署confluence

1.安装docker的过程就不说了。 2.下载镜像。 docker pull cptactionhank/atlassian-confluence:7.4.0 docker images 3.下载pojie 包。 https://download.csdn.net/download/liudongyang123/90285042https://download.csdn.net/download/liudongyang123/90285042https://do…