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.pswp.cn/news/397451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397451.shtml
英文地址,請注明出處:http://en.pswp.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;搶占式調…