列表

详情


NC205087. 牛妹爱数列

描述

牛妹正在玩一个数列
他手里有一个长度为n的序列a,保证它是一个01序列,并执行以下两种操作:
1.单点修改:将位置x上的数翻转(0变1,1变0);
2.前缀修改:将位置1~x上的数翻转(每个数都0变1,1变0)。
他现在想要最小化翻转次数,使得数列上的所有数都变为0。

输入描述

第一行,输入一个数n。
第二行,输入n个数,第i个数表示a_i

输出描述

输出最小翻转次数。

示例1

输入:

10
1 0 1 1 0 0 0 1 0 0

输出:

3

说明:

样例解释: 第一次使用(1)操作, 把2改掉:      1 1 1 1 0 0 0 1 0 0 第二次使用(2)操作, 把1-4全部改掉: 0 0 0 0 0 0 0 1 0 0 第三次使用(1)操作, 把8改掉:      0 0 0 0 0 0 0 0 0 0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 11ms, 内存消耗: 1016K, 提交时间: 2020-08-14 20:26:39

#include <bits/stdc++.h> 
using namespace std; 
int main(){ 
int dp[100005][2]; 
int n;
 cin>>n;
  dp[0][0]=dp[0][1]=0; 
  for(int i=1;i<=n;i++) 
  { int x;
   scanf("%d",&x); 
    dp[i][x]=min(dp[i-1][x],dp[i-1][!x]+1); dp[i][!x]=min(dp[i-1][!x]+1,dp[i-1][x]+2); } cout<<min(dp[n][0],dp[n][1]+1)<<endl; return 0; }

C++11(clang++ 3.9) 解法, 执行用时: 21ms, 内存消耗: 760K, 提交时间: 2020-08-28 18:04:17

#include<bits/stdc++.h>
using namespace std;
int n,a[100005],t,s;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=n-1;i>=0;i--)
        if((a[i]+t)%2==1){
            if(a[i-1]==a[i]) t++; s++;
        }
    cout<<s;
}

C(clang 3.9) 解法, 执行用时: 8ms, 内存消耗: 868K, 提交时间: 2020-08-28 18:09:36

#include<stdio.h>
int n,a[100005],t,s,i;
int main(){scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=n;i>0;i--)if((a[i]+t)%2==1){if(a[i-1]==a[i])t++;s++;}printf("%d",s);}

上一题