列表

详情


NC16745. 低位值

描述

定义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”

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 488K, 提交时间: 2019-06-27 13:32:30

#include<bits/stdc++.h>
using namespace std;
string s;
int main() {
    cin >> s;
    int ans = 0, cnt = 0;
    for (int i = 1; i < s.size(); ++i) if(s[i] == '1') ans = max(ans, (int)s.size()-i-1);
    for (int i = 0; i < s.size(); ++i) if(s[i] == '1') ++cnt;
    ans = max(ans, cnt-1);
    ans +=(s.size()-1)*s.size()/2;
    if(s.size()==1 && s[0] == '1') ans = 1;
    cout << ans << endl;
    return 0;
}

Python(2.7.3) 解法, 执行用时: 24ms, 内存消耗: 3660K, 提交时间: 2018-06-23 17:08:53

import sys
s = sys.stdin.readline().strip()
n = len(s)
if n == 1:
    print 1
    sys.exit(0)
l = [int(x) for x in list(s)]
b = sum(l) - 1
f = n - 1
for i in range(1, n):
    if l[i] == 0:
        continue
    if n-i==b:
        f = i-1
        break
    else:
        f = i
        break

a = n - f - 1
res = a + n*(n-1)/2

print res#int(s, 2), ''.join(map(str, l)), res

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 496K, 提交时间: 2020-04-24 22:38:53

#include<iostream>
using namespace std;
int main()
{
	string ch;
	cin>>ch;
	int sum=0,num=0;
	int len=ch.size();
	for(int i=1;i<=len&&!sum;i++)
		if(ch[i]=='1')
			sum=len-i;
	for(int i=len-1;i>=0&&!num;i--)
		if(ch[i]=='0'||i==0) 
			num=len-i;
	cout<<max(sum,num)+max(0,len*(len-1)/2-1);
}

上一题