P7337 Fun
文章目录
题目信息
| 字段 | 内容 |
|---|---|
| 题号 | P7337 |
| 难度 | 入门 |
| 知识点 | 模拟、计数 |
题目描述
给定两个长度为 n 的数组 a 和 b,统计在相同位置上两个数组值都为 1 的数量 sum。
根据 sum 与阈值 m 的大小关系,输出最终结果:
- 如果
sum > m:输出m + n - sum - 否则:输出
n
解题思路
核心思想
这是一道简单的模拟计数问题。
关键步骤:
- 读取两个数组
- 遍历统计
a[i] == 1 && b[i] == 1的位置数 - 根据条件输出结果
算法流程
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";
}
根据 sum 与 m 的大小关系选择输出。
复杂度分析
| 方法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 线性扫描 | O(n) |
O(n) |
说明:
- 只需遍历两次数组
- 空间用于存储数组
易错点
- 数组下标:本题使用 1-based 索引,注意初始化和边界
- 变量命名:
type是 C++ 关键字,避免用作变量名(使用typeVar) - 条件判断:
sum > m是严格大于,不是>=
类似题目
- P5717 角度与三角形(简单条件判断)
- P5718 奇怪的心跳(计数统计)
- P1420 最长连号(连续数判断)