P7337 Fun

文章目录

题目信息

字段 内容
题号 P7337
难度 入门
知识点 模拟、计数

题目描述

给定两个长度为 n 的数组 ab,统计在相同位置上两个数组值都为 1 的数量 sum

根据 sum 与阈值 m 的大小关系,输出最终结果:

  • 如果 sum > m:输出 m + n - sum
  • 否则:输出 n

解题思路

核心思想

这是一道简单的模拟计数问题。

关键步骤

  1. 读取两个数组
  2. 遍历统计 a[i] == 1 && b[i] == 1 的位置数
  3. 根据条件输出结果

算法流程

sum = 0
for i = 1 to n:
    if a[i] == 1 and b[i] == 1:
        sum++

if sum > m:
    output m + n - sum
else:
    output n

完整代码

C++

#include <bits/stdc++.h>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n, m, type;
    std::cin >> n >> m >> type;

    std::vector<int> a(n + 1), b(n + 1);
    for (int i = 1; i <= n; ++i) {
        std::cin >> a[i];
    }
    for (int i = 1; i <= n; ++i) {
        std::cin >> b[i];
    }

    int sum = 0;
    for (int i = 1; i <= n; ++i) {
        if (a[i] == 1 && b[i] == 1) {
            ++sum;
        }
    }

    if (sum > m) {
        std::cout << m + n - sum << "\n";
    } else {
        std::cout << n << "\n";
    }

    return 0;
}

Go

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	in := bufio.NewReader(os.Stdin)

	var n, m, typeVar int
	fmt.Fscan(in, &n, &m, &typeVar)

	a := make([]int, n+1)
	b := make([]int, n+1)

	for i := 1; i <= n; i++ {
		fmt.Fscan(in, &a[i])
	}
	for i := 1; i <= n; i++ {
		fmt.Fscan(in, &b[i])
	}

	sum := 0
	for i := 1; i <= n; i++ {
		if a[i] == 1 && b[i] == 1 {
			sum++
		}
	}

	if sum > m {
		fmt.Println(m + n - sum)
	} else {
		fmt.Println(n)
	}
}

Java

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int typeVar = Integer.parseInt(st.nextToken());

        int[] a = new int[n + 1];
        int[] b = new int[n + 1];

        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) {
            a[i] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) {
            b[i] = Integer.parseInt(st.nextToken());
        }

        int sum = 0;
        for (int i = 1; i <= n; i++) {
            if (a[i] == 1 && b[i] == 1) {
                sum++;
            }
        }

        if (sum > m) {
            System.out.println(m + n - sum);
        } else {
            System.out.println(n);
        }
    }
}

Python

import sys


def main() -> None:
    data = sys.stdin.read().split()
    it = iter(data)

    n = int(next(it))
    m = int(next(it))
    type_var = int(next(it))  # 变量名避免与 Python 关键字冲突

    a = [0] * (n + 1)
    b = [0] * (n + 1)

    for i in range(1, n + 1):
        a[i] = int(next(it))

    for i in range(1, n + 1):
        b[i] = int(next(it))

    total = 0
    for i in range(1, n + 1):
        if a[i] == 1 and b[i] == 1:
            total += 1

    if total > m:
        print(m + n - total)
    else:
        print(n)


if __name__ == "__main__":
    main()

JavaScript

'use strict';

function main() {
    const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split(/\s+/);

    const n = parseInt(input[0], 10);
    const m = parseInt(input[1], 10);
    const typeVar = parseInt(input[2], 10);  // 避免与 JS 关键字冲突

    const a = new Array(n + 1).fill(0);
    const b = new Array(n + 1).fill(0);

    for (let i = 1; i <= n; i++) {
        a[i] = parseInt(input[2 + i], 10);
    }

    for (let i = 1; i <= n; i++) {
        b[i] = parseInt(input[2 + n + i], 10);
    }

    let sum = 0;
    for (let i = 1; i <= n; i++) {
        if (a[i] === 1 && b[i] === 1) {
            sum++;
        }
    }

    if (sum > m) {
        console.log(m + n - sum);
    } else {
        console.log(n);
    }
}

main();

关键代码讲解

计数逻辑

int sum = 0;
for (int i = 1; i <= n; ++i) {
    if (a[i] == 1 && b[i] == 1) {
        ++sum;
    }
}

遍历数组,统计两数组相同位置同时为 1 的数量。

结果输出

if (sum > m) {
    std::cout << m + n - sum << "\n";
} else {
    std::cout << n << "\n";
}

根据 summ 的大小关系选择输出。

复杂度分析

方法 时间复杂度 空间复杂度
线性扫描 O(n) O(n)

说明

  • 只需遍历两次数组
  • 空间用于存储数组

易错点

  1. 数组下标:本题使用 1-based 索引,注意初始化和边界
  2. 变量命名type 是 C++ 关键字,避免用作变量名(使用 typeVar
  3. 条件判断sum > m 是严格大于,不是 >=

类似题目