SPOJ SORTBIT Sorted bit squence (数位DP,入门)

本文介绍了一种基于二进制表示中1的个数进行排序的方法,通过预处理组合数并采用二分查找技术,快速定位到第K个数。特别关注边界情况和负数的处理,实现简洁高效的解决方案。

 

 

 

题意:

  给出一个范围[m,n],按照二进制表示中的1的个数从小到大排序,若1的个数相同,则按照十进制大小排序。求排序后的第k个数。注意:m*n>=0。

 

 

思路:

  也是看论文的。一开始也能想到是这种解法,枚举0~31个1,逐步缩小第k个数的范围(其实就是找到第k个数应该有几个1),然后二分答案,直到找到第k个数。

  我只是在找第k个数时不是二分答案,而是想直接从最高位往低位走,判断左子树中满足条件的数的数量,然后控制往下一位应该是0还是1(即往树的哪一个孩子方向走,直到根)。其实也是二分思想。

  这题明显只有两个范围:[-INF,0]或者[0,INF],要特别注意n=0或者m=0的情况,有可能第k个数就是0,否则,是不是0就没有什么影响了。

 

 

 

 

 

  1 //#include <bits/stdc++.h>
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <map>
  7 #include <algorithm>
  8 #include <vector>
  9 #include <iostream>
 10 #define pii pair<int,int>
 11 #define INF 0x7f3f3f3f
 12 #define LL long long
 13 using namespace std;
 14 const double PI  = acos(-1.0);
 15 const int N=35; //注意大小
 16 
 17 int f[N][N], bit[N], m, n, k;;
 18 void pre_cal()  //预处理组合数
 19 {
 20     f[0][0]=1;
 21     for(int i=1; i<N; i++) //位数
 22     {
 23         f[i][0]=f[i][i]=1;
 24         for(int j=1; j<i; j++) //多少个1
 25         {
 26             f[i][j]=f[i-1][j]+f[i-1][j-1];
 27         }
 28     }
 29 }
 30 
 31 int cal(int n,int k,int b)
 32 {
 33     memset(bit, 0, sizeof(bit));
 34     int len=0, cnt=0, ans=0;
 35     while(n)    //转成b进制
 36     {
 37         bit[++len]=n%b;
 38         n/=b;
 39     }
 40     for(int i=len; i>0; i--)
 41     {
 42         if( bit[i]==1 )
 43         {
 44             ans+=f[i-1][k-cnt]; //统计左边的
 45             if(++cnt>k)   break;  //已超
 46         }
 47     }
 48     if(cnt==k)  ans++;
 49     return ans;
 50 }
 51 
 52 
 53 int get_ans(int m,int n,int k)
 54 {
 55     int i, num;
 56     for(i=0; i<=31; i++)    //枚举位数
 57     {
 58         num=cal(n,i,2)-cal(m-1,i,2);
 59         if(k-num<=0)    break;
 60         else   k-=num;
 61     }
 62     int L=m,R=n;
 63     while( L<R )            //二分答案
 64     {
 65         int mid=R-(R-L+1)/2;
 66         num=cal(mid,i,2)-cal(m-1,i,2);
 67         if( num<k ) L=mid+1;
 68         else        R=mid;  //如果等于,也是继续缩小范围的
 69     }
 70     return R;
 71 }
 72 
 73 
 74 int main()
 75 {
 76     //freopen("input.txt","r",stdin);
 77     pre_cal();
 78     int t;cin>>t;
 79     while(t--)
 80     {
 81         scanf("%d%d%d",&m,&n,&k);
 82         if(m<0)
 83         {
 84             m^=(1<<31); //改为正
 85             if(n==0)    //上界为0
 86             {
 87                 n--;
 88                 n^=(1<<31);
 89                 if(get_ans(m,n,k-1)==n) printf("0\n");
 90                 else cout<<(get_ans(m,n,k)^(1<<31))<<endl;
 91             }
 92             else
 93             {
 94                 n^=(1<<31);
 95                 cout<<(get_ans(m,n,k)^(1<<31))<<endl;  //恢复负值
 96             }
 97         }
 98         else
 99         {
100             if(m==0&&k==1)   {printf("0\n");continue;}
101             else if(m==0)    m++,k--;
102             cout<<get_ans(m,n,k)<<endl;
103         }
104     }
105     return 0;
106 }
AC代码

 

转载于:https://www.cnblogs.com/xcw0754/p/4852036.html

内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控与经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性与不确定性,提升系统运行的稳定性与电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性与可靠性目标,并通过仿真平台验证了所提方法的有效性与优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发与教学实践;②为实现微电网功率稳定控制与经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证与方案优化。; 阅读建议:建议结合提供的Simulink模型与相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建与参数调优方法,并通过与传统PID或MPC控制策略的对比实验,深入理解其在动态响应与鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。
内容概要:本文档聚焦于“直流电机双闭环控制Matlab仿真”,系统阐述了基于Matlab/Simulink平台实现直流电机双闭环控制系统(主要包括速度环与电流环)的设计与仿真全过程。通过构建直流电机的数学模型,结合PI控制器进行调控,实现对电机转速和电枢电流的高精度动态控制,验证控制策略的稳定性与响应性能。文档详细介绍了仿真模型的搭建流程、关键参数的整定方法、系统动态波形的分析手段以及仿真结果的有效性验证,体现了经典自动控制理论在实际电机系统中的工程应用,是电机控制与电力电子技术相结合的典型研究案例。; 适合人群:具备自动控制原理、电机与拖动基础、电力电子技术和Matlab/Simulink仿真能力的电气工程、自动化、机电一体化等专业的本科生、研究生及从事电机驱动系统研发的工程技术人员。; 使用场景及目标:①作为高校课程设计或实验教学材料,帮助学生深入理解双闭环调速系统的工作机理与工程实现;②服务于科研项目,为新型电机控制算法(如滑模、模糊PID等)的开发与性能对比提供基础仿真验证平台;③作为工业界产品前期设计的仿真工具,用于评估不同控制策略在动态响应、抗干扰能力和稳态精度方面的可行性。; 阅读建议:建议读者在学习过程中紧密结合自动控制理论知识,亲手在Simulink环境中搭建完整的双闭环仿真模型,通过反复调整PI控制器的比例与积分参数,观察并分析转速、电流的阶跃响应曲线,从而深刻理解反馈控制的本质、系统稳定性条件以及参数整定对动态性能的影响,进而掌握电机控制系统的设计精髓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值