【题解】最大二进制数

题意

给你一个二进制整数,你可以选择相邻的两位数字进行交换,最多交换次,能得到的最大的数是多少呢,输出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;
}
全部评论

相关推荐

Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务