美团2018年CodeM大赛-初赛B轮 C题低位值
试题链接:https://www.nowcoder.com/acm/contest/151/C
输入描述:
n以二进制形式给出,一行一个二进制01串n,表示l,r的上界。
1 <= 字符串n的长度 <= 20,000
数据保证没有前缀0。
输出描述:
一行一个整数表示答案。
输入
11
输出
2
说明
二进制串“11”对应的十进制数为“3” 解题思路:
对于公式f(l,r)而言,不断改变r的大小至l>=r,符合公式中条件(2)(3)每算一次会加1,则f(l,r)函数对应的值即为递归调用(2)(3)的次数。 首先,暴力打表将上限n跑到100

发现对于每个n而言,要使f(l,r)最大,l永远为1.
则此时otherwise的条件为 r-lowbit(r)<l<r ,由lowbit(r)的性质,r-lowbit(r)肯定为非负数。则取最大值时,r-lowbit(r)==0
此时再打表,观察发现r-lowbit(r)==0时,要是函数值最大,r 取到 1 2 4 8 16 32...这样2的整数次幂的数
此时便能得知该函数递归方式。对于一个二进制串,每次从右往左找到一个'1',将他置为'0'(条件2)至只有首位为'1'。
接着,将首位'1'置为'0',下一位的后几位全部置为'1'(条件3)
举例:1011101->1011100->1011000->1010000->1000000->111111->...
直至,二进制串变为'0'
由于当进行到类似1000...(条件3)二进制形式下这样的数时,后续都是相同操作,递归次数为 x*(x-1)/2
则,欲使f(l,r)最大,只要找到最接近上限n且'1'最多的二进制串
举例:101111 本身'1'就最多了 110001 当从左往右,第2个'1'置为0,后续置为'1'时,'1'最多,即 101111
具体实现看代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
char s[];
int main()
{
while(cin>>s)
{
int len=strlen(s);
if(len==)
{
puts("");continue;
}
int ans1=,ans2=;
for(int i=;i<len;i++)
{
if(s[i]=='') ans1++;
}
if(ans1>)
{
for(int i=;i<len;i++)
{
if(s[i]=='')
{
ans2=len-(i+); break;
}
}
}
cout<<max(ans1,ans2)+len*(len-)/<<endl; //本身的'1'的个数,和第2位'1'变'0',后续置'1'的串的'1'的个数比较
} return ;
}
美团2018年CodeM大赛-初赛B轮 C题低位值的更多相关文章
- 美团2018年CodeM大赛-初赛B轮 B 配送(最短路)
美团2018年CodeM大赛-初赛B轮 B 配送 题意 题解 对于每个任务,只要从上个任务的终点出发即可. 时间.地点很少,可以算出每个地点-时间的最小花费. 以题目描述的起点终点起始结束时间建图,很 ...
- 美团2017年CodeM大赛-初赛B轮-黑白树
https://ac.nowcoder.com/acm/problem/13249 链接:https://ac.nowcoder.com/acm/problem/13249来源:牛客网 题目描述 一棵 ...
- 美团2017年CodeM大赛-初赛B轮 黑白树 (树形dp)
大意: 给定树, 初始每个点全为白色, 点$i$有权值$k_i$, 表示选择$i$后, 所有距离$i$小于$k_i$的祖先(包括i)会变为黑色, 求最少选多少个点能使所有点变为黑色. 链上情况的话, ...
- 美团2017年CodeM大赛-初赛A轮 C合并回文子串
区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...
- 2018美团CodeM编程大赛初赛B轮 A题开关灯
题目描述 美团的办公室一共有n层,每层有m个会议室,可以看成是一个n*m的网格图.工程师们每天的工作需要协作的地方很多,经常要到会议室开会解决各种问题.公司是提倡勤俭节约的,因此每次会议室只在使用时才 ...
- codeM美团编程大赛初赛B轮D题
[编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...
- codeM美团编程大赛初赛B轮E题
题目描述 给出一个正整数n,我们把1..n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101.现在对于给定的n和字 ...
- codeM美团编程大赛初赛B轮D题(考验你的数学思维!)
[编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...
- 美团2018年CodeM大赛-资格赛 分数 暴力模拟
链接:https://www.nowcoder.com/acm/contest/138/D来源:牛客网 小胖参加了人生中最重要的比赛——MedoC资格赛.MedoC的资格赛由m轮构成,使用常见的“加权 ...
随机推荐
- 同步对象(同步条件Event)
event = threading.Event() #创建同步对象 event.wait() #同步对象等待状态 event.set() #同步对象设置Trueevent.clear() ...
- 纯Java——简易高并发框架
转自:https://blog.csdn.net/MonkeyDCoding/article/details/81369610 0.源代码github-简易高并发框架 注:本篇博客知识来自于网课. 1 ...
- MySQL索引原理及优化
一.各种数据结构介绍 这一小节结合哈希表.完全平衡二叉树.B树以及B+树的优缺点来介绍为什么选择B+树. 假如有这么一张表(表名:sanguo): (1)Hash索引 对name字段建立哈希索引: 根 ...
- 移动端UL列表无法平滑向下滚动问题
问题说明: 移动端向上滑动后,,列表无法自动滚动到底部~~而是类似屏幕"沾手"的效果(手离开屏幕直接停止在当前~列表不会自动向下滚动一段) 问题原因: 页面中存在如下代码: 当前页 ...
- 1.MySQL基础
1.创建一个数据库: create database db_test; 2.创建一个表: MySQL [mysql]> use db_test; Database changed MySQL [ ...
- Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14
组件化项目使用GreenDao时注意的事项: 1.要在组件化中的基础库(domain层)创建实体类: 2.如果sycn之后不能生产Dao文件,使用 Android Studio 的Gradle插件重新 ...
- hdu5698瞬间移动-(杨辉三角+组合数+乘法逆元)
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 一个JavaBean和DTO转换的优秀案例
所有的JavaBean和DTO的互相转换接口,JavaBean转化成DTO或者DTO转换JavaBean: public abstract class Converter<A, B> { ...
- Halcon示例:bottlet.hdev 光学字符识别(创建OCR)
* * Training of the OCR* The font is used in "bottle.hdev"* * * Step 0: PreparationsFontNa ...
- Failed to resolve:com.android.support:appcompat-v7:报错处理
既然是版本问题,那就的先去了解自己的电脑安装的SDK工具版本,点开SDK Manager图标,然后选中Updates就可以看到了 这里我的 sdk 工具版本就是26.1.1了 报错是因为自己的andr ...