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,一经查实,立即删除!

相关文章

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

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

Algorithm I assignment Collinear

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

Java BigDecimal详解

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

windows 串口编程 c语言,windows下C语言版串口发送程序(基于VS2017)

#include "tchar.h"#include int main(){/*****************************打开串口*************************************/HANDLE hCom;//全局变量&#xff0c;串口句柄hCom CreateFile(_T("COM3"),//COM3口GENERIC_READ | GENERIC_WRITE,//允许读和写0,/…

scikit-learn决策树算法类库使用小结

之前对决策树的算法原理做了总结&#xff0c;包括决策树算法原理(上)和决策树算法原理(下)。今天就从实践的角度来介绍决策树算法&#xff0c;主要是讲解使用scikit-learn来跑决策树算法&#xff0c;结果的可视化以及一些参数调参的关键点。 1. scikit-learn决策树算法类库介绍…

c语言编写程序求8,使用c语言编写程式,实现计算1*2*3+4*5*6+7*8*9+……+28*29*30的值...

使用c语言编写程式&#xff0c;实现计算1*2*34*5*67*8*9……28*29*30的值以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;使用c语言编写程式&#xff0c;实现计算1*2*34*5*67*8*9……28*29*3…

PHP 正则表达式分割 preg_split 与 split 函数

为什么80%的码农都做不了架构师&#xff1f;>>> preg_split() preg_ split() 函数用于正则表达式分割字符串。 语法&#xff1a; array preg_split( string pattern, string subject [, int limit [, int flags]] ) 返回一个数组&#xff0c;包含 subject 中沿着与…

简单学C——第五天

结构体 首先明确&#xff0c;结构体是一种构造的数据类型&#xff0c;是一种由多个数据类型如 int&#xff0c;char&#xff0c;double&#xff0c;数组或者结构体......组成的类型,现在告诉大家如何定义一个结构体。在定义int整型变量时&#xff0c;大家肯定都知道 int a; 即…

Codeforces Round #325 (Div. 2) B. Laurenty and Shop 前缀和

B. Laurenty and Shop Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/586/problem/BDescription A little boy Laurenty has been playing his favourite game Nota for quite a while and is now very hungry. The boy wants to make sau…

android gallery自动播放,可循环显示图像的Android Gallery组件

类型&#xff1a;源码相关大小&#xff1a;23.6M语言&#xff1a;中文 评分&#xff1a;9.1标签&#xff1a;立即下载第 4 页 实现循环显示图像的Gallery组件实现循环显示图像的Gallery组件在本节将组出与循环显示图像相关的ImageAdapter类的完整代码。读者可以从中看到上一节介…

curl网站开发指南

curl网站开发指南 作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月 4日 我一向以为&#xff0c;curl只是一个编程用的函数库。 最近才发现&#xff0c;这个命令本身&#xff0c;就是一个无比有用的网站开发工具&#xff0c;请看我整理的它的用法。 curl网站开发指南 阮一…

Who Gets the Most Candies? POJ - 2886 (线段树)

按顺时针给出n个小孩&#xff0c;n个小孩每个人都有一个纸&#xff0c;然后每个人都有一个val&#xff0c;这个val等于自己的因子数&#xff0c;如果这个val是正的&#xff0c;那就顺时针的第val个孩子出去&#xff0c;如果是负的话&#xff0c;就逆时针的第val个孩子出去&…

javax.validation.ValidationException: Unable to find a default provider

2019独角兽企业重金招聘Python工程师标准>>> [ERROR] [2016-11-16 13:58:21 602] [main] (FrameworkServlet.java:457) Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframewo…

android视频播放器api,03.视频播放器Api说明

03.视频播放器Api说明目录介绍01.最简单的播放02.如何切换视频内核03.切换视频模式04.切换视频清晰度05.视频播放监听06.列表中播放处理07.悬浮窗口播放08.其他重要功能Api09.播放多个视频10.VideoPlayer相关Api11.Controller相关Api12.边播放边缓存api13.类似抖音视频预加载14…

Taurus.MVC 2.0 开源发布:WebAPI开发教程

背景&#xff1a; 有用户反映&#xff0c;Tausus.MVC 能写WebAPI么&#xff1f; 能&#xff01; 教程呢&#xff1f; 嗯&#xff0c;木有&#xff01; 好吧&#xff0c;刚好2.0出来&#xff0c;就带上WEBAPI教程了&#xff01; 开源地址&#xff1a; https://github.com/cyq116…

chrome瀏覽器去掉緩存的方法

方法一&#xff1a; 1.開發說打開開發者工具 勾選這個訪問可以 方法二: commandshiftR 转载于:https://www.cnblogs.com/kaibindirver/p/9378572.html

sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2获取5.0系统的root

来说一下咱们的索尼Xperia Z2手机的5.0系统的root&#xff0c;因为现在很多机友的系统是5.0的&#xff0c;可是对于5.0的系统很多机友还不知道如何进行root操作&#xff0c;之前的针对4.4的系统的root方法肯定是用不到5.0的系统上的&#xff0c;因此需要专门的针对5.0的root软件…

ABP文档 - Javascript Api - AJAX

本节内容&#xff1a; AJAX操作相关问题ABP的方式 AJAX 返回信息处理错误 HTTP 状态码WrapResult和DontWrapResult特性 Asp.net Mvc 控制器Asp.net Web Api 控制器动态Web Api层Asp.net Core 控制器动态Web Api层AJAX操作相关问题 执行一个AJAX调用在现在的应用里非常常见&…

stack overflow--技术问答网站

转自&#xff1a;http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一个与程序相关的IT技术问答网站。用户可以在…

uvalive 4973 Ardenia

题意&#xff1a;给出空间两条线段&#xff0c;求距离。 注意输出格式&#xff01; 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 6 struct Point37 {8 int x, y, z;9 Point3(int x0, int y0, int z0):x(x),y(…