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;
}


内容概要:本文围绕基于风光储能和需求响应的微电网日前经济调度问题,提出了一套完整的Python代码实现方案。研究综合考虑风能、光伏等可再生能源的出力不确定性、储能系统的动态充放电特性以及需求侧响应机制,构建了以最小化系统综合运行成本为目标的优化调度模型。该模型充分体现了对可再生能源的高效消纳、系统经济性提升与供需平衡调控的能力,通过Python编程结合优化求解器实现了模型的求解与仿真验证,为微电网能量管理系统的设计与科研分析提供了可复现的技术路径与实践参考。; 适合人群:具备一定Python编程基础和电力系统优化调度知识的科研人员、工程技术人员及高校电气工程、能源系统等相关专业的研究生。; 使用场景及目标:①应用于微电网、智能配电网及综合能源系统的科研建模与仿真分析;②帮助读者深入理解含高比例可再生能源的电力系统日前调度建模方法、目标函数构造与约束条件处理技巧;③为实际工程中实现低碳、经济、可靠的微电网运行提供算法支持与决策依据。; 阅读建议:建议读者结合文档中的代码实例,系统学习优化模型的数学表达与编程实现过程,重点关注变量定义、目标函数构建、系统约束(如功率平衡、储能动态、机组出力等)的编码实现,并尝试调整负荷、新能源出力等输入数据进行多场景仿真,以深入掌握微电网调度策略的灵敏度分析与优化效果评估方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值