美团2018年CodeM大赛-初赛B轮 C题低位值

2023-11-11 16:18

本文主要是介绍美团2018年CodeM大赛-初赛B轮 C题低位值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接: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”

思路:

看了下公式,很明显对于给定的一个l,r,f(l,r)是有一个确定的值

那么知道确定l,r,就能算出最大值;


因为l,r都不确定,所以我把n设成100,暴力跑了区间内所有的l,r,

最后发现f(l,r)取最大值的时候,l永远是1;


确定了l之后,接下去就是确定r;

分析一下公式,因为知道了l=1,公式里的otherwise的情况是 r-lowbit(r)<l<r,既r-lowbit(r)=0的情况。

然后暴力跑了一个r-lowbit(r)=0,发现此时的r全是2的幂次;

大概直到f(1,r)是怎么跑的了。


对于一个2进制的r=1011101,它的变化情况是这样的:

1011101->1011100->1011000->1010000->1000000->111111->...


用文字表示就是:

(1)给一个二进制,把最右边的那个1变成0,直到这个数只有第一位是1,其它位是0;(公式里第二个条件)

(2)然后第一位变成0,后面全变成1;(公式里第三个条件)

重复执行(1),(2),直到1>=r,;(公式里第一个条件)


然后就是找r的过程,很明显应该挑[1,n]中二进制1最多的数,作为r;

假设n=10110001,那么r=10011111;也就是吧第二1变成0,后面全变成1

或者n=11111111,那么r=10000000;全是1,r就是n;

或者n=10000000,那么r=10000000;除了首位全是0,r=n;


int main()
{string str;cin >> str;int ans = 0;int num1 = 0;int num2 = 0;if (str == "1"){cout << "1" << endl;return 0;}for (int i = 1; i < str.size(); i++){if (str[i] == '1')num1++;}if (num1 == 1)		num2 = 1;else if (num1 == 0)	num2 = 0;else{for (int i = 1; i < str.size(); i++){if (str[i] == '1'){num2 = str.size() - (i+1);break;}}}ans = max(num1,num2)+(1 + str.size() - 1)* (str.size() - 1)/ 2;cout << ans << endl;return 0;
}


这篇关于美团2018年CodeM大赛-初赛B轮 C题低位值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391300

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at

百度之星 2015 初赛(1) 1002 找连续数

找连续数      Accepts: 401      Submissions: 1911  Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是

百度之星初赛1002(二分搜索)

序列变换    Accepts: 816    Submissions: 3578  Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 给定序列 A={A1,A2,...,An} , 要求改变序列A中

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些

美团面试题:生成字符串的不同方式

美团面试题:生成字符串的不同方式 引言问题分析动态规划思路伪代码C代码实现代码解析复杂度分析优化建议结论 引言 小红拿到了一个空字符串 s s s,她希望通过两种操作生成一个给定的字符串 t t t。我们需要计算生成字符串

金九银十,自动化测试面试题精选【美团二面】

面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来讲,技术的话只要通过了技术面hr面基本上是没有问题(也有少数企业hr面会刷很多人) 我们主要来说技术面,技术面的话主要是考察专业技术知识和水平,下面是我们整理好的自动化测试岗的面试题。 1.如