https://codeforc.es/gym/102001/problem/L
思路:优先删除1,保持首位1;
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define sfi(x) scanf("%d",&x)
#define sfc(x) scanf("%c",x)
#define sfl(x) scanf("%lld",&x)
#define sfs(x) scanf("%s",x)
#define pb push_back
#define fl() printf("flag!\n")
#define INF 0x3f3f3f3f
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int maxn=1e5+9;
const int mod=1e9+7;
ll power(ll x,ll n)
{
ll ans=1;
while(n)
{
if(n&1) ans=ans*x;
x=x*x;
n>>=1;
}
return ans;
}
ll get_num(string s)
{
ll num=0;
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]=='1')
num+=power(2,len-1-i);
}
return num;
}
int main()
{
//FAST_IO;
ll k;
cin>>k;
string s;
cin>>s;
int len=s.length();
ll tmp=k;
string t="";
while(tmp)
{
if(tmp&1)
{
t+='1';
}
else t+='0';
tmp>>=1;
}
reverse(t.begin(),t.end());
//cout<<t<<endl;
int lent=t.length();
int d=len-lent;
if(d<=0)
{
ll num=get_num(s);
if(num>k) cout<<1<<endl;
else cout<<0<<endl;
return 0;
}
int ans=0;
string res="";
for(int i=1;i<len;i++)
{
if(s[i]=='1')
{
s[i]='#';
ans++;
d--;
if(d==0)break;
}
}
if(d>0)
{
for(int i=1;i<len;i++)
{
if(s[i]=='0')
{
s[i]='#';
ans++;
d--;
if(d==0) break;
}
}
}
for(int i=0;i<len;i++)
{
//cout<<s[i];
if(s[i]!='#') res+=s[i];
}
//cout<<endl;
ll num=get_num(res);
if(num>k) ans++;
//cout<<res<<endl;
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<queue>
#include<map>
#include<cmath>
#include<iomanip>
#include<string.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#define IT set<node>::iterator
#define endl '\n'
#define FAST_IO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long LL;
typedef long long ll;
const ll inf = 1e18;
typedef unsigned long long ull;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
ll get_num(string s)
{
ll num = 0;
int len = s.length();
for (ll i = 0;i<len;i++)
{
//vif (s[i] == '1')
num = num * 2 + (s[i] - '0');
}
return num;
}
int main()
{
//FAST_IO;
ll k;
cin >> k;
string s;
cin >> s;
int ans = 0, flag;
while (get_num(s) > k) {
//cout << get_num(s) << endl;
ans++;
flag = 0;
for (int i = 1;i < s.size();i++)
{
if (s[i] == '1')
{
s.erase(s.begin()+i);
//cout << s << endl;
flag = 1;
break;
}
}
if (!flag) {
s.erase(s.begin()+s.size()-1);
//cout << s << endl;
}
}
//cout << ans << endl;
/*
if (d>0)
{
for (int i = 1;i<len;i++)
{
if (s[i] == '0')
{
s[i] = '#';
ans++;
d--;
if (d == 0) break;
}
}
}
for (int i = 0;i<len;i++)
{
if (s[i] != '#') res += s[i];
}
ll num = get_num(res);
if (num>k) ans++;
*/
cout << ans << endl;
return 0;
}