news 2026/5/14 20:02:10

P1243 排序集合【洛谷算法习题】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P1243 排序集合【洛谷算法习题】

P1243 排序集合

网页链接

P1243 排序集合

题目描述

对于集合N = { 1 , 2 , ⋯ , n } N=\{1,2,\cdots,n\}N={1,2,,n}的子集,定义一个称之为“小于”的关系:

S 1 = { X 1 , X 2 , ⋯ , X i } S1=\{X_1,X_2,\cdots,X_i\}S1={X1,X2,,Xi}( X 1 < X 2 < ⋯ < X i ) (X_1<X_2<\cdots<X_i)(X1<X2<<Xi)S 2 = { Y 1 , Y 2 , ⋯ , Y j } S2=\{Y_1,Y_2,\cdots,Y_j\}S2={Y1,Y2,,Yj}( Y 1 < Y 2 < ⋯ < Y j ) (Y_1<Y_2<\cdots<Y_j)(Y1<Y2<<Yj),如果存在一个k kk( 0 ≤ k ≤ min ⁡ ( i , j ) ) (0\leq k\leq\min(i,j))(0kmin(i,j)),使得X 1 = Y 1 , ⋯ , X k = Y k X_1=Y_1,\cdots,X_k=Y_kX1=Y1,,Xk=Yk,且k = i k=ik=iX k + 1 < Y k + 1 X_{k+1}<Y_{k+1}Xk+1<Yk+1,则称S 1 S1S1“小于”S 2 S2S2

你的任务是,对于任意的n ( n ≤ 31 ) n(n\leq31)n(n31)k ( k < 2 n ) k(k<2^n)k(k<2n),求出第k kk小的子集。

输入格式

输入文件仅一行,包含两个用空格隔开的自然数,n nnk kk

输出格式

输出文件仅一行,使该子集的元素,由小到大排列。空集输出0 00

输入输出样例 #1

输入 #1

3 4

输出 #1

1 2 3

解题思路

本题核心是子集字典序映射 + 二进制计数,将抽象的子集排序问题转化为简单的数值计算。题目定义的子集“小于”关系等价于字典序排序,空集为第1小的子集。总子集数为2 n 2^n2n,利用二进制规则遍历数字1 ∼ n 1 \sim n1n:对每个数i ii,计算其后方可组成的子集总数2 n − i 2^{n-i}2ni,若剩余排名k kk小于等于该值,则i ii属于目标子集;否则减去该总数并跳过。特判空集(k = 1 k=1k=1)输出0 00,其余按规则筛选元素后输出。算法时间复杂度O ( n ) O(n)O(n),简洁高效,完美适配n ≤ 31 n \le 31n31的数据范围。

总结

核心逻辑:子集字典序排序等价于二进制计数,逐位判断数字是否属于目标子集。
关键操作:空集特判、按序遍历数字、幂次计算筛选结果。
效率保障:线性遍历无冗余计算,精准匹配题目排序规则,无超时风险。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n,k;scanf("%lld%lld",&n,&k);if(k==1){printf("0\n");return0;}k--;for(ll i=1;i<=n;i++){if(k==0)break;if(k<=pow(2,n-i)){printf("%lld ",i);k--;}else{k-=pow(2,n-i);}}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 20:01:06

fp-go实际案例:从零构建一个完整的Web API [特殊字符]

fp-go实际案例&#xff1a;从零构建一个完整的Web API &#x1f680; 【免费下载链接】fp-go Functional programming library for Go 1.24, inspired by fp-ts. Uses generic type aliases for a clean, composable API. Provides Option, Either, Result, IO, IOResult, Read…

作者头像 李华
网站建设 2026/5/14 19:58:05

基于OpenAPI与JSON Schema的自动化测试代码生成器设计与实践

1. 项目概述&#xff1a;一个为测试而生的代码生成器最近在重构一个老项目的测试用例&#xff0c;看着那些动辄几百行、充斥着重复样板代码的测试文件&#xff0c;我陷入了沉思。作为一名有十多年经验的全栈开发者&#xff0c;我深知单元测试和集成测试对于保障代码质量、提升开…

作者头像 李华
网站建设 2026/5/14 19:57:21

Unix 命令 mkdir 详细介绍

mkdir 命令用于创建新的目录。基本语法:bashmkdir [OPTION]... DIRECTORY... 参数说明:DIRECTORY...: 要创建的目录名。可以指定多个目录。OPTION: 控制 mkdir 行为的选项。常用选项:选项描述-m mode设置新创建目录的权限模式。mode 使用八进制表示&#xff0c;例如 -m 755。-p…

作者头像 李华
网站建设 2026/5/14 19:54:36

中国药企与跨国药企的交易规模创下历史纪录 | 美通社头条

、美通社消息&#xff1a;益普索(Ipsos)最新发布的研究显示&#xff0c;过去一年&#xff0c;中国药企与跨国药企的交易规模创下历史纪录。根据国家药监局数据&#xff0c;2025年我国创新药对外授权交易总金额达到1356.55亿美元&#xff0c;交易数量为157笔&#xff0c;相较202…

作者头像 李华
网站建设 2026/5/14 19:52:45

基于Terraform的AI Agent网关在AWS上的生产级部署实践

1. 项目概述与核心价值 如果你正在寻找一个能让你在AWS上快速、安全地部署一个功能完整的AI Agent网关的方案&#xff0c;那么 infrahouse/terraform-aws-openclaw 这个Terraform模块&#xff0c;很可能就是你一直在找的“瑞士军刀”。这个模块的核心价值&#xff0c;在于它…

作者头像 李华
网站建设 2026/5/14 19:51:22

ESP32连接ROS保姆级教程:用Arduino IDE搞定WiFi通信(附完整代码)

ESP32连接ROS保姆级教程&#xff1a;用Arduino IDE搞定WiFi通信&#xff08;附完整代码&#xff09; 如果你手头有一块ESP32开发板&#xff0c;想快速实现与ROS系统的无线通信&#xff0c;却苦于找不到简单明了的教程&#xff0c;那么这篇文章就是为你准备的。我们将从零开始&a…

作者头像 李华