codeM C 低位值 (關於一些找結論,猜規律的一類題的啟發)
阿新 • • 發佈:2018-06-24
定義 tle bit while LV 數據 -o board 時間
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
定義函數f(l, r)為(其中0 <= l, r <= n): 輸入n,求f(l, r)的最大值。
鏈接:https://www.nowcoder.com/acm/contest/151/C
來源:牛客網
空間限制: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; }
codeM C 低位值 (關於一些找結論,猜規律的一類題的啟發)