正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 普及 2017 第一轮真题 › 第 25 题

NOIP 普及 2017 第一轮 第 25 题:二进制串前缀/后缀统计求最小修改数

阅读程序 · 枚举与模拟 · 难度 中等 · 答案 11

题目

```
#include<iostream>
using namespace std;
int main()
{
    string ch;
    int a[200];
    int b[200];
    int n, i, t, res;
    cin >> ch;
    n = ch.length();
    for (i = 0; i < 200; i++)
        b[i] = 0;
    for (i = 1; i <= n; i++)
    {
        a[i] = ch[i - 1] - '0';
        b[i] = b[i - 1] + a[i];
    }
    res = b[n];
    t = 0;
    for (i = n; i > 0; i--)
    {
        if (a[i] == 0)
            t++;
        if (b[i - 1] + t < res)
            res = b[i - 1] + t;
    }
    cout << res << endl;
    return 0;
}
```
输入:1001101011001101101011110001   
输出:_________
NOIP 普及 2017 第一轮 第 25 题 原题
原题扫描(页面加载后可直接在线作答)

本小题

阅读程序写结果:

答案

11

题解

考点定位

前缀和与分界位置枚举。

解题过程

a[i] 保存第 i 位的 0/1 值,b[i] 保存前 i 位中 1 的个数。逆序扫描到 i 时,t 保存区间 [i,n] 中 0 的个数。

因此 b[i−1]+t 表示把前缀 [1,i−1] 全改成 0、后缀 [i,n] 全改成 1 所需的修改次数。res 初始为 b[n],还覆盖了全部改成 0 的情况。

本题字符串长度为 28。扫描所有分界点,最小值出现在前缀长度为 3 时:前缀 100 有 1 个 1,剩余后缀有 10 个 0,共需修改 1+10=11 位。

答案:11。

易错提醒

a 的下标是字符串位置,b 是前缀和;它们不是按 ASCII 编码索引的字符计数表。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号