链接:https://www.nowcoder.com/acm/contest/151/C
来源:牛客网
低位值
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
定义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”对应的十进制数为“3”
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
string s;
while(cin>>s){
if(s.size()==1){cout<<"1"<<endl;}
else{
int num=0;int n=s.size();n--;
int num_=0;
for(int i=1;i<s.size();i++) if(s[i]=='1') num++;
for(num_=1;num_<s.size();num_++) if(s[num_]=='1') break;
if(num_!=s.size()){
num=max(num,(int)s.size()-num_-1);
}
ll aa=1ll*n*(n+1)/2;
aa+=num;
cout<<aa<<endl;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll tmp;int len;
ll lowbit(ll x){return x&(-x);}
ll solve(ll l,ll r){
if(l>=r) return 0;
if(r-lowbit(r)>=l) return 1+solve(l,r-lowbit(r));
return 1+solve(l,r-1);
}
int main(){
while(cin>>tmp){
ll aa=-1;int l_,r_;
for(ll i=0;i<=tmp;i++){
for(ll j=i+1;j<=tmp;j++){
if(aa<solve(i,j)){
aa=solve(i,j);
l_=i,r_=j;
}
}
}
cout<<aa<<endl;
cout<<l_<<" "<<r_<<endl;
}
return 0;
}