usaco 01串 Stringsobits

原创 2016年08月29日 09:13:30

题目背景
考虑排好序的N(N<=31)位二进制数。
题目描述

他们是排列好的,而且包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L<=N)的数。

你的任务是输出第i(1<=i<=长度为N的二进制数的个数)小的(注:题目这里表述不清,实际是,从最小的往大的数,数到第i个符合条件的,这个意思),长度为N,且1的位数的个数小于等于L的那个二进制数。

(例:100101中,N=6,含有位数为1的个数为3)。
输入输出格式
输入格式:

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

输出格式:

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

输入输出样例
输入样例#1:

5 3 19

输出样例#1:

10011

题解
动态规划,f[i][j] = f[i-1][j] + f[i-1][j-1]
f[i][j] f[i][j]表示长度为I的二进制数最多1的个数为j的数的个数。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<cstring>
#include<string>

using namespace std;

typedef long long LL;
const int maxn = 100 + 100;

LL n,l,t;
LL f[maxn][maxn];
//很容易发现,不论是哪一位,如果前面一样,
//那一位为1的话一定比那一位为0的大小大。

//所以,如果k>f[i-1][j]的话,第i位一定为1,
//之后k减去f[i-1][j],剩下的数重复该操作。
void solve()
{
    scanf("%lld%lld%lld",&n,&l,&t);
    for(int i =0;i<=n;i++) f[i][0]= f[0][i] = 1;
    for(int i =1;i<=n;i++)
    {
        for(int j =1;j<=n;j++)
        {
            f[i][j] = f[i-1][j]+f[i-1][j-1];
        }
    }
    for(int i =n;i>=1;i--)
    {
        if(t>f[i-1][l])
        {
            printf("1");
            t -=f[i-1][l];
            l--;
        }else
        {
            printf("0");
        }
    }
    printf("\n");
}
int main()
{
    solve();
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

3.2 Stringsobits01串

描述考虑排好序的N(N

USACO-Section 3.2 Stringsobits(DP)

dp[i][j]表示长度为i的二进制数中含有1的个数不超过j的个数 则状态转移方程为:dp[i][j]=dp[i-1][j-1]+dp[i-1][j]; 边界条件是:dp[i][0]=dp[0][i]...

USACO--3.1Stringsobits

开始的时候暴力了一次,但是在第10个点就超时了.后面才知道这个题实际上是一个组合数的题目.在每个位置我们可以选择放0或者1,并且我们可以统计出每种放法后面数的排列数,然后我们可以决定放0或放1,继续这...
  • acm_lkl
  • acm_lkl
  • 2015年04月21日 21:43
  • 423

USACO Stringsobits, 还是得搬出动态规划来

这题证明俺现在真是老了,退步了,这是第一份代码: #include using namespace std;   ifstream fin("kimb...

USACO Stringsobits

不是特别好想的一道题,首先

USACO Section 3.2 Stringsobits - 排列组合

首先要恶心两点..数据要用64位整型来处理...再一个...00000也是要算个数里的...所以在来推时将N-1再推更为直观...      这道题思路还是很好出来的...就用排列组合的思维...C...
  • kk303
  • kk303
  • 2011年12月13日 22:56
  • 626

【C++】【USACO3.2.2】01串

问题描述】   给出三个整数:N,L,i。需要你找出长度为N,且1的个数小于等于L的二进制数中,第i小的那个二进制数。【输入格式】 共一行,用空格分开的三个整数N,L,i。 【输出格式】 共一...
  • ctf109
  • ctf109
  • 2017年08月02日 10:15
  • 85

usaco3.2.2 Stringsobits

一 原题 Stringsobits Kim Schrijvers Consider an ordered set S of strings of N (1 This set of str...

USACO 3.2 Stringsobits (kimbits)

/* 动态规划。尝试暴搜,但是超时了 分析: 设长度为n的01串,1的个数不大于v的个数为dp[n,v] 方程:dp[n,v]=dp[n-1,v]+dp[n-1,v-1]; //分别表示在当前位加上...

Stringsobits dp

描述考虑排好序的N(N你会发现,这很有趣。因为他们是排列好的,而且包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L你的任务是输出第i(1(例:100101中,N=6,含有位数为1的个数为3...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:usaco 01串 Stringsobits
举报原因:
原因补充:

(最多只允许输入30个字)