codeM C 低位值 (关于一些找结论,猜规律的一类题的启发)

本文介绍了一道计算机科学领域的编程题,题目要求输入一个二进制数n,求解函数f(l,r)的最大值,该函数定义了在特定范围内二进制表示中低位值的运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:https://www.nowcoder.com/acm/contest/151/C
来源:牛客网

低位值
时间限制:C/C++ 1秒,其他语言2秒
空间限制: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

输出

复制
2

说明

二进制串“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;
}

  

转载于:https://www.cnblogs.com/vainglory/p/9218766.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值