试题链接:https://www.nowcoder.com/acm/contest/151/C

定义lowbit(x) =x&(-x),即2^(p-1) (其中p为x的二进制表示中,从右向左数第一个1的位置),例如lowbit(10)=2,lowbit(3)=1。

定义函数f(l, r)为(其中0 <= l, r <= n):
输入n,求f(l, r)的最大值。

输入描述:

n以二进制形式给出,一行一个二进制01串n,表示l,r的上界。
1 <= 字符串n的长度 <= 20,000
数据保证没有前缀0。

输出描述:

一行一个整数表示答案。
示例1

输入

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题低位值的更多相关文章

  1. 美团2018年CodeM大赛-初赛B轮 B 配送(最短路)

    美团2018年CodeM大赛-初赛B轮 B 配送 题意 题解 对于每个任务,只要从上个任务的终点出发即可. 时间.地点很少,可以算出每个地点-时间的最小花费. 以题目描述的起点终点起始结束时间建图,很 ...

  2. 美团2017年CodeM大赛-初赛B轮-黑白树

    https://ac.nowcoder.com/acm/problem/13249 链接:https://ac.nowcoder.com/acm/problem/13249来源:牛客网 题目描述 一棵 ...

  3. 美团2017年CodeM大赛-初赛B轮 黑白树 (树形dp)

    大意: 给定树, 初始每个点全为白色, 点$i$有权值$k_i$, 表示选择$i$后, 所有距离$i$小于$k_i$的祖先(包括i)会变为黑色, 求最少选多少个点能使所有点变为黑色. 链上情况的话, ...

  4. 美团2017年CodeM大赛-初赛A轮 C合并回文子串

    区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...

  5. 2018美团CodeM编程大赛初赛B轮 A题开关灯

    题目描述 美团的办公室一共有n层,每层有m个会议室,可以看成是一个n*m的网格图.工程师们每天的工作需要协作的地方很多,经常要到会议室开会解决各种问题.公司是提倡勤俭节约的,因此每次会议室只在使用时才 ...

  6. codeM美团编程大赛初赛B轮D题

    [编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...

  7. codeM美团编程大赛初赛B轮E题

    题目描述 给出一个正整数n,我们把1..n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101.现在对于给定的n和字 ...

  8. codeM美团编程大赛初赛B轮D题(考验你的数学思维!)

    [编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...

  9. 美团2018年CodeM大赛-资格赛 分数 暴力模拟

    链接:https://www.nowcoder.com/acm/contest/138/D来源:牛客网 小胖参加了人生中最重要的比赛——MedoC资格赛.MedoC的资格赛由m轮构成,使用常见的“加权 ...

随机推荐

  1. 为laravel队列安装supervisor并配置

    supervisor 是用 Python 开发的进程管理程序;python 在主流的 linux 发行版都已经内置了:pip 则是 python 的一个包管理工具:跟 php 的 composer 类 ...

  2. Sql Server数据库之四个增删改查

    一.数据库的增删改查 1.新建数据库 create database students on primary ( name="students_data",--主数据文件的逻辑名 ...

  3. (译)内存沉思:多个名称相关的神秘的SQL Server内存消耗者。

    原文出处:https://blogs.msdn.microsoft.com/sqlmeditation/2013/01/01/memory-meditation-the-mysterious-sql- ...

  4. 思维导图-mysql log

  5. c++冒号作用

    转自http://www.360doc.com/content/13/0605/11/3373961_290615318.shtml 1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bi ...

  6. 记账本,C,Github,entity

    package entity; public class Category { private int id; private String name; private int recordNumbe ...

  7. CSS3实现投影效果

    Webkit引擎定义了-webkit-box-reflect属性,该属性能够实现投影效果,具体语法如下: -webkit-box-reflect: <direction> <offs ...

  8. SQLLDR导入乱码问题的解决

    SQLLDR导入乱码问题的解决   处理过程: 1.本地建立控制文件   load data infile 'd:\TMP_KAITOUSHUJU.csv' into table TMP_KAITOU ...

  9. zabbix-3.4.10系列

    第1节 zabbix体系架构图:

  10. c++ 面试题(海量数据篇)

    1,在海量数据中找中位数: 题目如下: 只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数,写一个算法. 解答:http://www.cnblogs.com/youxin/archiv ...