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个学生,编号为1if(n==1) printf("1\n1\n");// 当有2个学生时,只能选择1个学生,输出1个学生,编号为1if(n==2) printf("1\n1\n");// 当有3个学生时,可以选择2个学生,输出2个学生,编号为1和3if(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)=nif(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]);// 如果是最后一个学生对,输出编号后直接换行elseprintf("%d %d\n",arr[i+n/2],arr[i]);}}// 当n为奇数时,2*(n/2)=n-1else{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个学生,编号为1if(n == 1) std::cout << "1\n1\n";// 当有2个学生时,只能选择1个学生,输出1个学生,编号为1else if(n == 2) std::cout << "1\n1\n";// 当有3个学生时,可以选择2个学生,输出2个学生,编号为1和3else 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] << " ";// 如果是最后一个学生对,输出编号后直接换行elsestd::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; // 输出 1cout << 1; // 输出 1}// 处理 n == 3 的情况else if (n == 3) {cout << 2 << endl; // 输出 2cout << 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 1if (n <= 2) {cout << 1 << endl << 1;}// 如果 n == 3,输出 2 1 3else {cout << 2 << endl << 1 << " " << 3;}return 0; // 结束程序}// 创建一个大小为 n 的向量 arr,并初始化为 1, 2, 3, ..., nvector<int> arr(n);for (int i = 0; i < n; i++) {arr[i] = i + 1;}// 输出 ncout << 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; // 结束程序
}
相关文章:
C语言/C++自然序列重排列——相邻序号不相邻问题⭐
同类题目:C语言自然序列重排——相邻元素的差值集合恰好有 k 个不同的值。⭐⭐-CSDN博客 题目描述(难度⭐) 一场针对 n 学生的考试将在一个又长又窄的房间里举行,因此学生们将按某种顺序排成一行。老师怀疑相邻编号的学生…...
Spring boot面试题---- Spring boot项目运行原理
1.启动流程概述 Spring Boot 的启动是从一个带有main方法的主类开始的。这个主类通常会有一个@SpringBootApplication注解。这个注解是一个组合注解,它包含了@Configuration、@EnableAutoConfiguration和@ComponentScan。@Configuration注解表明这个类是一个配置类,它可以定义…...

Qt/C++ 基于 QGraphicsView 的绘图软件 (附源码下载链接)
基于 Qt 的 QGraphicsView 绘图软件项目进行深入讲解,分析其核心代码与功能实现,帮助开发者理解 QGraphicsView 的用法。 项目概览 该项目实现了一个简单的绘图应用,用户可以在界面中创建和编辑矩形、椭圆、直线、多边形和文本等图形对象。功…...
如何使用 useMemo 和 memo 优化 React 应用性能?
使用 useMemo 和 memo 优化 React 应用性能 在构建复杂的 React 应用时,性能优化是确保应用流畅运行的关键。React 提供了多种工具来帮助开发者优化组件的渲染和计算逻辑,其中 useMemo 和 memo 是两个非常有用的 Hook。本文将详细介绍这两个工具的使用方…...

数据结构(链表 哈希表)
在Python中,链表和哈希表都是常见的数据结构,可以用来存储和处理数据。 链表是一种线性数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以用来实现栈、队列以及其他数据结构。Python中可…...

人工智能之深度学习_[4]-神经网络入门
神经网络基础 1 神经网络 深度学习神经网络就是大脑仿生,数据从输入到输出经过一层一层的神经元产生预测值的过程就是前向传播(也叫正向传播)。 前向传播涉及到人工神经元是如何工作的(也就是神经元的初始化、激活函数…...

STM32之CubeMX图形化工具开发介绍(十七)
STM32F407 系列文章 - STM32CubeMX(十七) 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体…...
css3过渡总结
一、过渡的定义与作用 CSS3 过渡(Transitions)允许 CSS 属性在一定的时间区间内平滑地过渡,从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅,给用户带来更好的视觉体验。例如,当一个元素从隐藏状态…...

latin1_swedish_ci(latin1 不支持存储中文、日文、韩文等多字节字符)
文章目录 1、SHOW TABLE STATUS WHERE Name batch_version;2、latin1_swedish_ci使用场景注意事项修改字符集和排序规则修改表的字符集和排序规则修改列的字符集和排序规则修改数据库的默认字符集和排序规则 3、ALTER TABLE batch_version CONVERT TO CHARACTER SET utf8mb4 C…...

C语言编程笔记:文件处理的艺术
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、为什么要用文件二、文件的分…...
[创业之路-255]:《华为数字化转型之道》-1-主要章节、核心内容、核心思想
目录 前言:数字化转型对于企业而言,是一种全方位的变革 一、主要章节 1、认知篇(第1~2章)- Why 2、方法篇(第3~5章)- How 3、实践篇(第6~10章)- 实践 4、平台篇(第…...

《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答: 问:《汽车维修技师》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《汽车维修技师》级别? 答:省级。主管单位:北方联合出版传媒(…...

2024 京东零售技术年度总结
每一次回望,都为了更好地前行。 2024 年,京东零售技术在全面助力业务发展的同时,在大模型应用、智能供应链、端技术、XR 体验等多个方向深入探索。京东 APP 完成阶段性重要改版,打造“又好又便宜”的优质体验;国补专区…...

PyTorch使用教程(8)-一文了解torchvision
一、什么是torchvision torchvision提供了丰富的功能,主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集,如ImageNet、CIFAR-10、MNIST等,方便开发者进行训练和评估。模型模块封装了大量经…...
如何在不暴露MinIO地址的情况下,用Spring Boot与KKFileView实现文件预览
在现代Web应用中,文件预览是一项常见且重要的功能。它允许用户在不上传或下载文件的情况下,直接在浏览器中查看文件内容。然而,直接将文件存储服务(如MinIO)暴露给前端可能会带来安全风险。本文将介绍如何在不暴露MinI…...

ICMP协议和ICMP重定向攻击
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网络安全从菜鸟到飞鸟的逆袭 目录 一,ICMP基本概念二&…...

leetcode203-移除链表元素
leetcode203 什么是链表 之前不懂链表的数据结构,一看到链表的题目就看不明白 链表是通过next指针来将每个节点连接起来的,题目中给的链表是单向链表,有两个值,一个val表示值,一个next:表示连接的下一个…...
Rust 中构建 RESTful API
在 Rust 中构建 RESTful API,你可以选择几个不同的框架。每个框架有不同的特点、优缺点和适用场景,下面我将介绍几个常用的 Rust Web 框架,并分析它们的优缺点。 Actix Web 简介: Actix Web 是一个非常高性能的 Web 框架…...

Sqlmap入门
原理 在owasp发布的top10 漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害的。 当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄漏 分类 按注入类型 常见的sql注入…...

迈向 “全能管家” 之路:机器人距离终极蜕变还需几步?
【图片来源于网络,侵删】 这是2024年初Figure公司展示的人形机器人Figure 01,他可以通过观看人类的示范视频,在10小时内经过训练学会煮咖啡,并且这个过程是完全自主没有人为干涉的! 【图片来源于网络,侵删】…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...