【题解】最大二进制数
题意
给你一个二进制整数,你可以选择相邻的两位数字
进行交换,最多交换
次,能得到的最大的数是多少呢,输出10进制下的该数,对
取模。
题解
我们只需要贪心去将在后面的往前提即可。我们模拟交换这个过程,由于把这个这个
往前提几个位置就是进行交换多少次,我们从第一个出现
的位置之后来找
,将
往前提到这
之前,这个时候这个
的位置就往后移动一位了。当剩余的移动次数小于
时,为了最大我们往前移动剩下次数即可。
复杂度
时间复杂度
代码
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; string a; int main() { long long n,k; scanf("%lld%lld",&n,&k); cin >> a; int pos = (a.find('0') == a.npos? n: a.find('0')); for (int i = pos+1; i < n; i++) { if (a[i] == '1') { if (i-pos < k) { swap(a[i], a[pos]); k -= (i-pos); pos++; } else { swap(a[i], a[i-k]); break; } } } long long ans=0; for(int i=0; i<n; i++) { ans=(ans*2+a[i]-'0')%mod; } printf("%lld\n",ans); return 0; }