D题题解

牛牛爱字符串

https://ac.nowcoder.com/acm/contest/6885/A

比赛时候弄错了一行代码,一直没AC,吐血。。。
直接贪心,从后往前翻,只要出现连续两个1就进行翻转,这样就能确保收益大于直接修改的,具体细节看代码(不过好像dp的方法比较无脑,贪心的细节容易错,好吧,还是太菜了)

记录修改的位置,通过二分查找判断每个点在翻转完毕以后是1还是0,如果是1就需要修改。

#include <bits/stdc++.h>
using namespace std;
int a[100100],pre[100100];
int loc[100100];
int lian0[100100],lian1[100100];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]==0)
        {
            if(a[i-1]!=0) lian0[i]=1;
            else lian0[i]=lian0[i-1]+1;
            lian1[i]=0;
        }
        else if(a[i]==1)
        {
            if(a[i-1]!=1) lian1[i]=1;
            else lian1[i]=lian1[i-1]+1;
            lian0[i]=0;
        }
    }
    //for(int i=1;i<=n;i++) cout<<lian0[i]<<" "<<lian1[i]<<endl;
    bool flag=true;
    int cnt=0;
    int top=0;
    for(int i=n;i>=1;i--)
    {
        if(flag&&lian1[i]>1&&a[i]==1)//翻转
        {
            loc[top++]=i;
            cnt++;
            flag=false;
        }
        else if(flag==false&&lian0[i]>1&&a[i]==0)//翻转
        {
            loc[top++]=i;
            cnt++;
            flag=true;
        }
    }
    reverse(loc,loc+top);
    //for(int i=0;i<top;i++) cout<<loc[i]<<" ";
    for(int i=1;i<=n;i++)
    {
        int p=lower_bound(loc, loc+top, i)-loc;
        p=top-p;
        //cout<<i<<"-p:"<<p<<endl;
        if((p&1)==1&&a[i]==0)
        {
            cnt++;
            //cout<<"i:"<<i<<endl;
        }
        else if((p&1)==0&&a[i]==1)
        {
            cnt++;
            //cout<<"i:"<<i<<endl;
        }
    }
    printf("%d\n",cnt);
}
全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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