SPOJ - SORTBIT Sorted bit squence 数位dp

本文介绍了一种特殊的排序算法,该算法针对区间内的整数,依据其二进制表示中的1的数量进行排序,并解决了负数的补码表示问题。通过枚举1的数量,实现了高效的查找第k个数的目标。

题目:将区间[m,n]内的所有整数按照其二进制表示中 1 的数量从小到大排序。如果 1 的数量 相同,则按照数的大小排序。求这个序列中的第 k个数。其中,负数使用补码来表示:一个 负数的二进制表示与其相反数的二进制之和恰好等于2^32。 m*n>=0

思路:枚举1的个数,然后找到区间内含有若干个1的数量,最终得到第K个数包含几个1。这样就确定出了答案中包含了len个1。

对于m和n是负数的情况,最高位都为1,我们先把最高位的1去掉,就转化成了正数,然后再进行统计,最后输出的时候把最高位加上即可。

注意0要特判。

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f

int dp[35][35];
void Init(){
    mm(dp,0);
    dp[0][0]=1;
    for(int i=1;i<=31;i++){
        dp[i][0]=dp[i][i]=1;
        for(int j=1;j<i;j++)
            dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
    }
}
int cal(int n,int k){
    int res=0,tot=0;
    for(int i=31;i>=1;i--){
        if(n&(1<<(i-1))){
            res+=dp[i-1][k-tot];
            tot++;
            if(tot>k)
                break;
        }
    }
    if(tot==k) res++;
    return res;
}
int solve(int L,int R,int K){
    int ans=0,l=L,r=R,len=1;
    for(int i=1;i<=31;i++){
        int now=cal(R,i)-cal(L-1,i);
        if(K<=now)
            break;
        K-=now;
        len=i+1;
    }
    while(l<=r){
        int mid=((LL)l+(LL)r)/2;
        if(cal(mid,len)-cal(L-1,len)>=K){
            ans=mid;
            r=mid-1;
        }
        else
            l=mid+1;
    }
    return ans;
}
int main(){

    int T,m,n,k;
    Init();
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&m,&n,&k);
        if(m==0&&n==0){
            printf("%0\n");
            continue;
        }
        if(m>=0){
            if(m==0){
                m++;
                k--;
            }
            if(k==0){
                printf("0\n");
                continue;
            }
            int ans=solve(m,n,k);
            printf("%d\n",ans);
        }
        else{
            if(n==0){
                n=-1;
                k--;
            }
            m=m&(~(1<<31));
            n=n&(~(1<<31));
            int ans=solve(m,n,k);
            printf("%d\n",ans|(1<<31));
        }
    }
    return 0;
}


代码下载链接: https://pan.quark.cn/s/a175d1ef418b 标题部分中的"新建文件夹 (2).zip"暗示这是一个采用ZIP编码方式的压缩文档,这种格式通常用于将多个关联的文件或目录整合进一个压缩单元中。在信息技术领域,ZIP编码格式是一种广泛应用的标准,它支持将多个数据单元压缩成一个独立的压缩文件,从而提升文件传输的便捷性、存储空间的利用效率以及管理的便捷度。ZIP格式的压缩文件可以通过多种解压缩工具进行访问,例如WinRAR软件、7-Zip应用程序或操作系统自带的压缩解压功能。 描述文本里的"shop"字样或许指向这个压缩文档与商业店铺、电子商务平台或网络销售系统存在关联。在Java编程范畴内,这有可能是一个范例项目,用以说明构建电子商务平台相关功能的实现方法,涵盖商品维护、购物车功能以及订单处理等模块。Java语言因其跨平台兼容性、系统稳定性以及完备的库资源支持,经常被选作开发大型企业级应用的技术栈,尤其是电子商务系统。 依据标签"java"的指示,可以推断压缩包内部可能包含了采用Java编程语言编写的源代码片段、系统配置文档、数据库操作脚本及其他辅助性资源。Java程序员一般借助集成开发环境(IDE)如Eclipse、IntelliJ IDEA或NetBeans进行Java代码的编写、编译及执行操作。这些开发工具能够高效地支持ZIP文件中项目结构的导入与管理。 文件命名列表仅列出一个条目"新建文件夹 (2)",这或许意味着压缩文档中包含一个同名的文件夹,该文件夹内可能收纳了一系列子文件及子目录。在实际的Java开发任务中,类似的结构可能包含src目录(存放程序源代码)、lib目录(存放项目依赖的jar库文件)、resou...
内容概要:本文系统研究了基于Kantorovich距离的SBR(Sequential Benefit Replacement)算法在电力系统场景削减中的应用,旨在从大量原始不确定性场景中筛选出最具代表性的典型场景,以降低随机优化问题的计算复杂度。该方法通过引入Kantorovich距离(也称Wasserstein距离)精确量化场景之间的差异性,并结合SBR算法实现场景的逐步合并与削减,有效保留原始场景的概率分布特征。文中提供了完整的Matlab代码实现,便于用户复现算法,特别适用于处理风电出力、负荷波动等具有强随机性和不确定性的多场景优化问题,如微电网调度、电氢耦合系统运行等。; 适合人群:具备一定概率统计、优化理论基础和Matlab编程能力,从事电力系统、新能源并网、能源互联网、随机规划及综合能源系统优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于高比例可再生能源接入下的电力系统随机优化调度、微电网能量管理、多能互补系统等需要进行多场景分析与决策的建模场景;②帮助研究人员深入掌握Kantorovich距离的数学原理与计算方法,以及SBR算法的迭代逻辑与实现技巧,提升对不确定性建模、场景生成与削减技术的理解与应用能力; 阅读建议:建议读者结合提供的Matlab代码,重点理解距离矩阵的构建、场景权重的更新规则以及场景合并的判定逻辑,通过调试代码并代入实际风电或负荷数据进行案例测试,以深刻领会算法的核心思想与工程价值。
内容概要:本文围绕电力系统短期负荷预测问题,深入研究了基于极限学习机(ELM)及其智能优化算法的应用方法,提出并实现了白鲸优化算法(BWO)和鹭鹰优化算法(IBOA)对ELM模型的关键参数进行寻优的技术路径。通过Matlab编程实现,优化后的模型有效提升了预测精度,降低了原始ELM因随机初始化带来的不稳定性和误差波动,增强了模型在面对电力负荷不确定性变化时的泛化能力和鲁棒性。研究系统阐述了ELM的基本原理、两种新型群智能优化算法的搜索机制及其在解决非线性参数优化问题上的优势,并通过实验对比验证了优化模型在均方根误差(RMSE)、平均绝对百分比误差(MAPE)等指标上的显著优越性,为电力系统负荷预测提供了高效可靠的解决方案。; 适合人群:具备电力系统分析、人工智能算法理论基础及Matlab编程能力的高校研究生、科研机构研究人员以及电力公司从事负荷预测、电网调度与能源管理的工程技术人员。; 使用场景及目标:①应用于电网调度中心的短期负荷预测业务,提高预测准确性,保障电力供需平衡;②为智能优化算法在电力工程领域的落地应用提供可复现的技术范例;③支撑电力市场出清、发电计划制定、储能系统配置及需求侧响应等关键决策环节; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点理解ELM网络结构搭建、适应度函数设计、优化算法迭代流程及预测结果后处理等关键步骤,通过调整数据集和参数设置,深入掌握模型调优技巧,并尝试将该方法迁移至风电、光伏功率预测等相似时序预测任务中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值