zoukankan      html  css  js  c++  java
  • 【USACO 3.2.2】二进制数01串

    【描述】

    考虑排好序的N(N<=31)位二进制数。

    你会发现,这很有趣。因为他们是排列好的,而且包含所有可能的长度为N且含有1的个数小于等于L(L<=N)的数。

    你的任务是输出第I(1<=I<=长度为N的二进制数的个数)大的,长度为N,且含有1的个数小于等于L的那个二进制数。

    注意:这里“长度为N”包括长度小于N的数(我们认为高位用0补齐)

     

    【格式】

    PROGRAM NAME: kimbits
    INPUT FORMAT:(file kimbits.in)

    共一行,用空格分开的三个整数N,L,I。

    OUTPUT FORMAT:(file kimbits.out)

    共一行,输出满足条件的第I大的二进制数。

    【分析】

    简单的组合数学的题目,用二分法,对每一位判断当改位是0的时候的有多少个符合条件的数就行了。

    注意加个记忆化,注意开longlong

     1 #include <cstdlib>
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <cmath>
     6 const int maxn=32+5;
     7 using namespace std;
     8 long long c[maxn][maxn],n,o=0;
     9 long long C(long long  a,long long b) 
    10 {
    11     if (a==0) return 1;
    12     if(c[a][b]!=-1) return c[a][b];
    13     return a==1?b:c[a][b] = ((C(a-1,b)*(b-a+1)))/a;
    14 }
    15 long long total(long long num,long long len,long long Maxo);
    16 int main()
    17 {
    18     long long l,i,len;//cnt是已有1的个数 
    19     //文件操作
    20     freopen("kimbits.in","r",stdin);
    21     freopen("kimbits.out","w",stdout); 
    22     char ans[maxn];
    23     memset(c,-1,sizeof(c));
    24     memset(ans,0,sizeof(ans));
    25     scanf("%lld%lld%lld",&n,&l,&i);
    26     for (len=0;len<n;len++)//枚举长度 
    27     {
    28         long long temp=total(0,len,l);
    29         
    30         if (temp>=i) ans[len]=0+'0';
    31         else {ans[len]=1+'0';i=i-temp;o++;}
    32     }
    33     printf("%s",ans);
    34     return 0;
    35 }
    36 //剩下len位 
    37 long long total(long long num,long long len,long long Maxo)
    38 {
    39     long long cnt=0;
    40     len=n-len-1;
    41     for (long long i=0;(i+o)<=Maxo;i++)//剩余位中1的个数 
    42     cnt+=C(i,len);
    43     return cnt;
    44 }
  • 相关阅读:
    Python3之random模块常用方法
    Go语言学习笔记(九)之数组
    Go语言学习笔记之简单的几个排序
    Go语言学习笔记(八)
    Python3之logging模块
    Go语言学习笔记(六)
    123. Best Time to Buy and Sell Stock III(js)
    122. Best Time to Buy and Sell Stock II(js)
    121. Best Time to Buy and Sell Stock(js)
    120. Triangle(js)
  • 原文地址:https://www.cnblogs.com/hoskey/p/3810916.html
Copyright © 2011-2022 走看看