D-牛客爱数列

牛妹爱数列

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

链接:https://ac.nowcoder.com/acm/contest/6885/D
来源:牛客网

题意:

给你一个长度为n的01序列,你每次能进行下列操作中的一个
1.单点修改:将x位置上的数翻转0变1,1变0
2.前缀修改:将1~x上的数翻转
问你最小的翻转次数

solution:

1.由条件推出,任何数翻转它的偶数次,保持其原来状态不变,否则状态改变
2.如果进行前缀修改,那么对于长度为x的前缀来说,你要贪心的使x,x-1,x-2....上的连续1的个数尽可能大于1
举个例子110101 如果只进行前缀翻转 001010->110100->001000->000000进行了四次翻转,而如果从后往前出现1的连续个数为1进行单点修改,那么110100->110000->000000这样只要进行3次翻转,因此对于连续1的个数大于1才可能形成最优解
因为对连续1的个数为1的进行前缀翻转,会将其前面的0翻转为1,这样你就会增加1次将前面的1翻转会原来0的次数的机会,而如果连续1的个数大于二,最多也就会前缀翻转两次,小于等于将区间的连续翻转的次数
因此我们只要从后往前遍历,对连续1的个数为1的进行单点修改,连续1的个数多于1的进行前缀修改即可

#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int cnt=0,num=0;
    for(int i=n-1;i>=0;i--)
    {
        if((a[i]+cnt)%2==1)
        {
            if(i>0)
            {
                if(a[i-1]==a[i])cnt++;
                else num++;
            }
            else
                num++;
        }
    }
    cout<<cnt+num;
}
全部评论
太强了
点赞 回复 分享
发布于 2020-08-15 11:35

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

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