洛谷 题解 P2727 【01串 Stringsobits】
本蒟蒻又双叒叕被爆踩辣!
其实只要理解了就会觉得这是个傻逼题!
这题给的标签是 dp,搜索,数论
但是可以用二分的思路做!
Solution:
从最高位开始枚举,
我们考虑每一位,是不是只可以取0/1
那么我们就先求出当此位置为0时,它可以做到的方案数(等会再告诉你们为什么要求
我们想一想,什么时候此位该为0,什么时候此位该为1???
我们求出它的方案数,那这个方案数是不是就是但此位为0时可以达到的最大值;
如果i比这个最大值还要大的话,此位为0是不是就做不到了。
result:
所以,如果这个方案数比i大,说明排名为i的数一定属于最高位是0的数,否则就属于最高位为1的数。
你就逐位考虑下来就可以了!
这就是运用了二分的思路,对其进行求解。
至于方案数的话,在最开始跑一遍dp就行了,
g[i][j] = g[i - 1][j - 1] + g[i - 1][j];
就是它为0/1前一位的值相加即可。
code:
#include<bits/stdc++.h>//万能头
using namespace std;
#define maxn 60//可以稍微大一点
#define int long long//这是个坑
#define Rep(x, a, b) for(int x = a; x <= b; ++ x)
#define Dep(x, a, b) for(int x = a; x >= b; -- x)
int n, l, k, g[maxn][maxn], sum[maxn][maxn], a[maxn];
//g[k][i]是来表示在前k位中,恰有i个1的二进制数的数量
//sum[k][i]是来表示在前k位中,最多有i个1的二进制数的数量
//a[i]是当前这一位是0/1,输出是用。
void dfs(int x, int l, int k){
if(x == 0){//跑到了最后一位了
Dep(i, n, 1){//输出路径
printf("%d", a[i]);
}
exit(0);//不可以用return,return只结束当前这一轮函数,exit(0)就可以直接结束程序。
}
if(k <= sum[x - 1][l]){//如果它小于或等于此位取0时的最大值
a[x] = 0;//当前这位就取0;
dfs(x - 1, l, k);//并且直接跑到下一位
}
else{//如果它大于的话
a[x] = 1;//当前就取1;
dfs(x - 1, l - 1, k - sum[x - 1][l]);//并且跑下一位的时候要把还可以取的‘1’的数量-1,然后要跑的数位也会减去这位取了‘1’以后减下的值。
}
}
signed main(){
scanf("%d%d%d", &n, &l, &k);//RT
g[0][0] = 1;//初始化,一定要记得
Rep(i, 1, n){
g[i][0] = 1;//如果只要0个‘1’,肯定只有1种方法。
Rep(j, 1, n){
g[i][j] = g[i - 1][j - 1] + g[i - 1][j];//递归求恰有i个1的二进制数的数量
}
}
Rep(i, 0, n){
Rep(j, 0, n){
Rep(k, 0, j){
sum[i][j] += g[i][k];//跑一下求最多有i个1的二进制数的数量
}
}
}
dfs(n, l, k);//搜索一下就可以了
return 0;
}
在这里还说一下我前两次Wa在那
First:
我求sum[ ][ ]的时候,不是从第0位开始跑的。。。
Second:
没开long longQAQ
Ps:请看懂再抄
洛谷 题解 P2727 【01串 Stringsobits】的更多相关文章
- 洛谷P2727 01串 Stringsobits
P2727 01串 Stringsobits 24通过 55提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 这题的思路是啥啊!!!跪求- 题目背景 考虑 ...
- 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)
洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...
- 【洛谷】P1032 字串变换
题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...
- 洛谷 题解 UVA572 【油田 Oil Deposits】
这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...
- 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)
必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- Luogu P2727 【01串 Stringsobits】
看到题解里好像都是用$DP$解决的,本着禁止DP的原则,我来提供一发纯数学其实和DP本质相同的题解,前两天刚反演题,脑子炸了,本来说换换脑子,结果还是数学 首先受进制思想启发,我们不妨按位考虑,考虑这 ...
- 洛谷P4493 [HAOI2018]字串覆盖(后缀自动机+线段树+倍增)
题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能 ...
- 洛谷 题解 UVA1626 【括号序列 Brackets sequence】
看还没有人发记搜的题解,赶紧来水发一篇 我们定义dp[i][j]为区间i~j内最少添加几个括号才能把这个串变成正规括号序列. 考虑四种情况 i>j不存在这种子串,返回0 i==j子串长度为1无论 ...
随机推荐
- 『题解』Coderforces352A Jeff and Digits
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Jeff's got n cards, each card contains ...
- acm经验(转)
先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华 ...
- python——函数的基本概念
Python函数认识 数学定义 y = f(x), y是x的函数,x是自变量. python中的函数组成 由若干语句组成的语句块.函数名称.参数列表构成,函数是组织代码的最小单元 像一个黑盒子,我们给 ...
- PHP str_replace的用法
PHP str_replace的用法 1 替换单个字符<pre><?phpecho str_replace("world","Shanghai" ...
- T-SQL Part IX, PIVOT and UNPIVOT
不同于CROSS JOIN, CROSS APPLY, OUTER APPLY,MSDN文档对PIVOT和UNPIVOT 想得重视了一点,单独做了一个页面来介绍. 简单来说,PIVOT用来把行转成列, ...
- C++中对C的扩展学习新增语法——内联函数以及函数参数
内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...
- 斐波那契数列的实现(C语言)
int fibonacci(int positon){ if(position==1||position==2){ return 1; } return fibonacci(position-1)+f ...
- (C#)WPF:Margin属性和Padding属性的介绍
1.在进行界面设计时,Margin 和Padding都是对边距进行限制的,其区别在于“一个主外,一个主内”. Margin (边缘)是约束控件与容器控件的边距,设置值分别代表左上右下,使用 Margi ...
- Maven系列第8篇:你的maven项目构建太慢了,我实在看不下去,带你一起磨刀!!多数使用maven的人都经常想要的一种功能,但是大多数人都不知道如何使用!!!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第8篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
- 力扣(LeetCode)长按键入 个人题解
你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的名字(其中一 ...