题目:

FJ给他的奶牛用二进制进行编号,每个编号恰好包含K 个"1" (1 <= K <= 10),且必须是1开头。FJ按升序编号,第一个编号是由K个"1"组成。

请问第N(1 <= N <= 10^7)个编号是什么。

不同寻常的暴力:

样例是升序的第7个,我把1--7都列出来。

1 1 1

1 0 1 1

1 1 0 1

1 1 1 0

1 0 0 1 1

1 0 1 0 1

1 0 1 1 0

发现的规律是,每次将二进制串的从右往左数的第1个前面为0的1往左移一位。

这个1右边的1全部靠后。  其实想想也很容易可以想出答案:既然我要移动1的位置了,那肯定是高位拉 , 那我后面的1就是反正最后咯,这样才可以是理论上的最小;

a[i]表示的是第i个1的位置,初始值为(按阳历来说)第一个1的位置是1,第二个

1的位置是2,第三个1的位置是3.二进制也就是1 1 1 。

能移动的条件是,当前1的位置+1不等于

下一个1的位置,也就是前面是空的。然后就这样啊....

#include<cstdio>
using namespace std;
int n,k,j;
int a[];
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=k;i++)a[i]=i;
for(int i=;i<=n;i++){
j=;
while(){
a[j]++;
if(a[j]!=a[j+])break;
a[j]=j;
j++;
}
}
j=k;
for(int i=a[k];i>=;i--){
if(a[j]==i)printf(""),j--;
else printf("");
}
return ;
}

组合数学法:(摘取一片博客 , 我还不是很qq理解)

一个只有0和1的数字串,只有1对数字串大小有影响,0没有影响,大小取决于1的位置和数量。

因为题目中要求出第n个编号是什么,并且这道题有一个限制:第一位必须是0,那么我们先将这个串用足够大小保存,足够大的话我们可以添加前导0,到最后从第一个非0位输出即可,也就是说我们要找到一个m,使得C(m,k) >= n,可以二分求m。

当k=1直接特判掉。

从大到小确定每一位。

如果做到第i位,之前已经填了j个1,那么这一位填0的方案数就是C(i-1,k-j),即还剩i-1位可以填k-j个1的方案数。

如果这个数小于n,那么这一位填1,并且n要减去这个数,否则这一位填0。

不过这个组合数会非常大,还会爆long long,需要分类讨论进行二分求m.一定要注意这点,第一次提交就在这里wa的QwQ

时间复杂度O(sqrt(n)k)

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = ;
long long n , k , m;
long long num[maxn] , cnt;
long long mid , l , r;
long long zuhe(int x , int y)
{
long long k = ;
for(int i = x;i > x - y;i --)
{
k *= i;
}
for(int i = y;i > ;i --)
{
k /= i;
}
return k;
}
int main(){
scanf("%lld%lld" , &n , &k);
if(k == )
{
for(int i = n;i > ;i --)
{
if(i == n)
{
printf("");
}
else printf("");
}
puts("");
return ;
}
else {
//分类讨论二分求m
if(k == )
{
l = ;
r = ;
while(l <= r)
{
mid = (l + r) / ;
if(zuhe(mid , k) >= n)
{
m = mid;
r = mid - ;
}
else {
l = mid + ;
}
}
}
else {
if(k >= )
{
l = ;
r = ;
while(l <= r)
{
mid = (l + r) / ;
if(zuhe(mid , k) >= n)
{
m = mid;
r = mid - ;
}
else {
l = mid + ;
}
}
}
else {
l = ;
r = ;
while(l <= r)
{
mid = (l + r) / ;
if(zuhe(mid , k) >= n)
{
m = mid;
r = mid - ;
}
else {
l = mid + ;
}
}
}
}
for(int i = m;i > ;i --)
{
long long t = zuhe(i - , k);
if(t < n)
{
num[i] = ;
n -= t;
k --;
if(!cnt)
{
cnt = i;
}
}
if(!k || !n)
{
break;
}
}
for(long long i = cnt;i > ;i --)
{
printf("%d" , num[i]);
}
}
puts("");
return ;
}

动态规划:

太菜了没有想到组合数

我们也医用数位dp去做;

f[i][j] 表示在前i位我们放j个1的情况有几种

f[i][j]=f[i-1][j]+f[i-1][j];

然后我们直接大力的从字符串的高位开始枚举

如果这个位子不放我们后来所有的方法都不够了那就放

#include<bits/stdc++.h>
#define Ll long long
using namespace std;
const Ll N=,M=1e5+;
Ll a[M],f[M][N];
Ll n,m,ok,v;
int main()
{
scanf("%lld%lld",&m,&n);
if(n==){
cout<<;
for(int i=;i<m;i++)printf("");
return ;
}
for(Ll i=;i<=1e5;i++)f[i][]=;
for(Ll i=;i<=1e5;i++)if(!v)
for(Ll j=;j<=n;j++){
f[i][j]=f[i-][j]+f[i-][j-];
if(j==n&&f[i][j]>=m){v=i;break;}
}
for(Ll i=v;i;i--){
if(f[i-][n]<m)
a[i]=,m-=f[i-][n],n--;
if(a[i])ok=;
if(ok)cout<<a[i];
}
}

组合数字最快然后超神暴力然后动态规划

[USACO12FEB]牛的IDCow IDs 一题多解(求二进制中有k个1 ,第n大的数)的更多相关文章

  1. 洛谷P3048 [USACO12FEB]牛的IDCow IDs

    P3048 [USACO12FEB]牛的IDCow IDs 12通过 67提交 题目提供者lin_toto 标签USACO2012 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 ...

  2. [USACO12FEB]牛的IDCow IDs

    题目描述 Being a secret computer geek, Farmer John labels all of his cows with binary numbers. However, ...

  3. 洛谷 P3048 [USACO12FEB]牛的IDCow IDs

    题目描述 Being a secret computer geek, Farmer John labels all of his cows with binary numbers. However, ...

  4. LUOGU P3048 [USACO12FEB]牛的IDCow IDs(组合数)

    传送门 解题思路 组合数学.首先肯定是要先枚举位数,假如枚举到第\(i\)位.我们可以把第一位固定,然后那么后面的随意放\(1\),个数就为\(C_{i-1}^{k-1}\).然后每次枚举时如果方案\ ...

  5. P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 贪心题.先选中 \(c_i\) 最小的 \(k\) 头牛,如果这样就超过 \(m\) ,直接退出,输出答案.否则考虑把后面的牛依次加入, ...

  6. 洛谷P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...

  7. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

  8. 牛客网Java刷题知识点之为什么HashMap和HashSet区别

    不多说,直接上干货! HashMap  和  HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...

  9. 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

随机推荐

  1. 在CentOS7.5里安装FTP服务器

    安装了一台CentOS7.5,字符界面,为方便上传文件到这台机器上,拟采用FTP服务上传和下载文件,在CentOS上搭建vsftpd服务环境. 记录我的安装过程,供有需要的人参考. 一.系统环境 1. ...

  2. FreeMarker 的空值处理 , 简单理解 , 不用TMD就会忘记

    NO.1 而对于FreeMarker来说,null值和不存在的变量是完全一样的 NO.2 ! 指定缺失变量的默认值 返回String NO.3 ?? 判断变量是否存在 返回boolean NO.4 $ ...

  3. Mac OS 10.8 中的 OpenGL 开发环境设置(转)

    转自:http://www.th7.cn/Program/cp/201305/137743.shtml 一.XCode 4.5 在项目的"Build Phases">&quo ...

  4. MongoDB整理笔记の导入导出

    一.导入 1.导入json数据 我们先将表user删除掉,以便演示效果: > db.user.drop(); true > show collections; system.indexes ...

  5. Ubuntu在用root账户使用xftp连接时提示拒绝连接

    一般来说Linux不允许使用root账户连接,修改配置 vi /etc/ssh/sshd_config #Authentication: LoginGraceTime PermitRootLogin ...

  6. 学习使用MS SQL Server游标(CURSOR)

    说实的,使用MS SQL Server这样久,游标一直没有使用过.以前实现相似的功能,都是使用WHILE循环加临时表来实现.刚才有参考网上示例练习写了一下.了解到游标概念与语法. 下面代码示例中,先是 ...

  7. Thread Group(线程组)

    线程组,可以理解用户池,用来产生线程(用户),每一个线程代表一个用户,在使用JMeter进行性能测试过程中,经常需要模拟多个用户进行测试,可以通过设置线程数代表多少个用户,通常一个线程组就代表一个测试 ...

  8. 【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs

    都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. /* http://www.cnblogs.com/karl07/ */ #include <cs ...

  9. 题解 CF950B 【Intercepted Message】

    题目链接 先吐槽一番:本宝宝好久没写过题解了...首先我们想一个贪心策咯.就是我们预处理出前缀和,然后一边扫过去,记录一个l1,l2和一个n1,n2.分别表示我们现在第一个数组切到l1,上一次切是在n ...

  10. 八大排序算法的python实现(三)冒泡排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L): for i in range( ...