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

 

 

 

题意:

  给出一个范围[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老web换新枝----Sails.js移动设备的全新生产力(五)

自定义模型操作目前为止&#xff0c;我们的进展非常顺利&#xff0c;我们使用了 Sails 的默认路由来访问或修改模型实例。这些默认设置&#xff08;包含在 Sails Blueprint API 中&#xff09;负责我们期望从 Web 或移动应用程序获得的基本的创建&#xff08;create&#xff09…

linux 驱动没有设备id,linux不同总线的设备和驱动的匹配过程分析

摘自&#xff1a;前几日读书会&#xff0c;谈到linux中driver和device的匹配问题&#xff0c;我认为是通过设备名来匹配的&#xff0c;因为我之前看过platform的驱动&#xff0c;它就是通过设备name和驱动name来进行匹配&#xff0c;所以我确信linux里边所有的驱动和设备都是这…

理解Flight框架核心

看到了这篇分析flight的文章还不错&#xff0c;就转过来了&#xff0c;地址&#xff1a;https://blog.csdn.net/sky_zhe/article/details/38906689 Flight框架&#xff08;官网&#xff09;是一个微型的PHP框架&#xff0c;它简单&#xff0c;快速&#xff0c;可扩展。借助Flig…

安装ISO系统(原版系统)系统终极方法

首先进入PE&#xff0c;在PE下找到你的系统ISO镜像&#xff0c;解压缩&#xff0c;然后将镜像里的boot文件夹、sources文件夹和bootmgr文件提取出来&#xff0c;然后复制到你要安装的分区&#xff08;比如c盘&#xff09;&#xff0c;接下来拔下U盘&#xff0c;重新启动计算机&…

intel i218v千兆网卡 linux驱动,适用于英特尔® 千兆位以太网网络连接的 Linux* 基础驱动程序...

适用于英特尔 千兆位以太网网络连接的 Linux* igb* 基础驱动程序安装说明Linux* igb 驱动程序支持所有基于 82575、82576、82580&#xff0c;I350&#xff0c;I354 和 I210/I211 的英特尔 千兆位以太网网络连接。有关驱动程序配置的详细信息&#xff0c;请参阅下载中心中的自述…

Linux下如何抓取串口码流,linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系...

转&#xff1a;https://blog.csdn.net/lugandong/article/details/72468831一、拿512fs说话&#xff1a;看图知道采样的位深是32bit(位)&#xff0c;左右声道各占了8*32BCLK&#xff0c;那一个完整的LRCLK一共8*32*2512BCLK。其实xxxfs就是这么算出来的&#xff0c;也是固定的&…

第 39 章 ThinkPHP--CURD 操作

学习ThinkPHP 模型中的 CURD 操作&#xff0c;也就是增删改查。通过 CURD&#xff0c; 我们可以方便快速的对数据库进行操作。 1.数据创建 2.数据写入 3.数据读取 4.数据更新 5.数据删除 一&#xff0e;数据创建 在数据库添加等操作之前&#xff0c;我们首先需要对数据进行创建…

洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 乱搞

题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。…

linux语言的说明顺序有哪些,(linux常用头文件详解.doc

(linux常用头文件详解linux常用头文件详解POSIX标准定义的头文件??????? 目录项???????? 文件控制??? 文件名匹配类型??? 路径名模式匹配类型??????? 组文件??? 网络数据库操作??????? 口令文件??? 正则表达式??????? TAR归档…

第 39 章 ThinkPHP--视图

学习要点&#xff1a; 1.模版定义 2.赋值和渲染 3.模版地址 4.获取内容 本节课&#xff0c;我们将要学习一下 ThinkPHP 视图&#xff0c;视图是 Web 的可见内容&#xff0c;一般是 HTML 结合 PHP 获取的数据提供给用户使用的部分&#xff0c;属于 MVC 中的 V。 一&#xff0e;模…

mysql日志(介绍 路径修改 备份)

2019独角兽企业重金招聘Python工程师标准>>> 环境&#xff1a;senos6 软件&#xff1a;mysql2.6.20 mysql日志&#xff1a; 错误日志 一般查询日志 慢查询日志 二进制日志 只记录DDL&#xff0c;DML等引起数据库改变的操作都会记录下来 复制&am…

Sort

<?xml version"1.0" encoding"utf-8"?> SortSort 1 Sort Select sort is the simplest sorting alogrithms. 1.1 IDEA 1.find the smallest element in the rest of array 2.exchange the element with with the i th entry. 3.repeat step1 and s…

a标签实现不跳转点击

<a class"tiao" href"./index.php"></a> JS实现无跳转a标签 <script type"text/javascript"> $(".tiao").click(function (){return false; }) </script> 转载于:https://www.cnblogs.com/wenhainan/p/…

linux下的c语言控制灯闪烁,C语言实现LED灯闪烁控制

原标题&#xff1a;C语言实现LED灯闪烁控制/********* 配套 **********/#include //包含 寄存器的头文件/****************************************函数功能&#xff1a;延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回…

VBA and Access

>>.用vba连接ACESS&#xff1a; Set Conn Server.CreateObject("ADODB.Connection") Conn.ConnectionString"ProviderMicrosoft.Jet.OLEDB.4.0;Data Source" & Server.MapPath("sample.mdb") Conn.Open>>.用vba连接EXCEL,打开EX…

温州大学c语言作业布置的网站,老师APP上布置作业 三年级娃为刷排名半夜做题_央广网...

在温州读小学三年级的皮皮(化名)&#xff0c;因为学习需要&#xff0c;在妈妈黄女士的手机里安装了5个APP学习软件。有数学速算的&#xff0c;英语配音的&#xff0c;还有语文复习的。这些软件&#xff0c;都是班上的老师推荐安装的。每天放学回家&#xff0c;皮皮就拿着黄女士…

Algorithm I assignment Collinear

这本来应该是第三周的作业&#xff0c;但是由于其他作业逼近deadline&#xff0c;暂时推后了一周完成。 这周的assignment大大提高了我对这门课的看法&#xff0c;不得不说&#xff0c;Algorithms这门课的assignment部分设计得很好。为什么好&#xff1f;个人认为有以下几点&am…

vc c语言坐标图,VC++6.0下C语言画图编程问题

复制内容到剪贴板代码:#include#includevoid CSinusoidView::OnDraw(CDC* pDC){CSinusoidDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen cpen,pen;pen.CreatePen(PS_SOLID,4,RGB(0,0,0));cpen.CreatePen(PS_SOLID,2…

Java BigDecimal详解

1.引言 float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算&#xff0c;这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而&#xff0c;它们没有提供完全精确的结果&#xff0c;所以不应该被用于要求精确结果的场合。但是…

Erlang库 -- 有意思的库汇总

抄自这里 首先&#xff0c;库存在的目的大致可分为&#xff1a;1、提供便利2、尽可能解决一些痛点首先&#xff0c;我们先明确一下Erlang编程语言的一些痛点&#xff08;伪痛点&#xff09;&#xff1a;1&#xff0c;单进程问题Erlang虚拟机属于抢占式调度&#xff0c;抢占式调…