zoukankan      html  css  js  c++  java
  • [校内自测] 奶牛编号 (递推+智商)

    奶牛编号 cowids

    ##【题目描述】:

    作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛。

    然而,他有点迷信,标识奶牛用的二进制数字,必须只含有K位“1”。当然,每个标识数字的首位必须为“1”。

    FJ按递增的顺序,安排标识数字,开始是最小可行的标识数字(由“1”组成的一个K位数)。不幸的是,他没有记录下标识数字。请帮他计算,第N个标识数字。

    ##【输入描述】:

    1行:空格隔开的两个整数,N和K。

    ##【输出描述】:

    如题,第N个标识数字。

    ##【样例输入】:

    7 3

    ##【样例输出】:

    10110

    ##【时间限制、数据范围及描述】:

    时间:1s 空间128M

    1 <= K <= 10, 1 <= N <= 10^7

     真基尔惭愧啊,呆孬都测好了laj还没想好这题 laj还是太laj辣 _(:зゝ∠)_

    一开始想了些很玄学的做法,比如一个个往里面插0?不过这只停留在理论层面 _(:зゝ∠)_ 最后十分钟的时候laj终于想好了,可惜还是比别人迟了十分钟再交QAQ

    姑且算作一道递推题吧qwq

    思路:先写个杨辉三角留着算组合数qwq 哦对当时由于时间太紧了laj连杨辉三角都忘记怎么写了ovo还有只输入两个数,laj当时脑子一片混沌看到n的范围直接写了个读入优化 _(:зゝ∠)_ 然后找max{ i | c[i][k]<=n,k≤i≤∞} 这时候算出来的i就是最后输出的数的长度,因为此时假设所有数全是0,然后取k个数,把这k个数全部改成1,方案数即长度为i的最大数n为c[i][k],首先第一个输出的数肯定是1,然后从最高位一步步的往下算即可,把k=3的时候n从1~20全写成出来就能找到规律了,在此不赘述qwq 对了当n或者k等于1的时候要特判qwq

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 LL n,k;
     5 LL a[5005][100];
     6 void work(){
     7     int i,j;
     8     memset(a,0,sizeof(a));10     for (i=1;i<=5000;i++){
    11         a[i][0]=1;
    12         for (j=1;j<=min(i,20);j++){
    13             if (j==i) a[i][j]=1;
    14             else a[i][j]=a[i-1][j]+a[i-1][j-1];
    15         }
    16     }
    17 }
    18 int main(){
    19     freopen ("cowids.in","r",stdin);
    20     freopen ("cowids.out","w",stdout);
    21     int i,j,len;
    22     scanf("%lld%lld",&n,&k);
    23     work();
    24     len=k;
    25     if (n==1){for (i=1;i<=k;i++) putchar('1'); return 0;}
    26     if (k==1) {printf("1");for (i=1;i<n;i++) putchar('0');return 0;}
    27     while (a[len][k]<=n) len++; len--;k--;
    28     for (i=k;i<len;i++) n-=a[i][k];
    29     putchar('1');
    30     for (i=1;i<=len;i++){
    31         if (k==0){
    32             putchar('0');
    33         }
    34         else if (a[len-i][k]>=n){
    35             putchar('0');
    36         }
    37         else{
    38             putchar('1');
    39             n-=a[len-i][k];
    40             k--;
    41         }
    42     }
    43     return 0;
    44 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7689455.html
Copyright © 2011-2022 走看看