文章

【GESP】C++二级练习 luogu-B3698 [语言月赛202301] 一次函数

GESP二级练习,多层循环和分支练习,难度★★☆☆☆。

luogu-B3698 [语言月赛202301] 一次函数

题目要求

题目描述

在二维平面坐标系 $xOy$ 中,一个点的位置可以由横坐标 $x$ 和纵坐标 $y$ 两个参数描述,其坐标记为 $(x,y)$。

一次函数 $y=kx+b$ 是满足纵坐标 $y$ 等于 $k$ 乘以横坐标 $x$ 加 $b$ 的点的集合,即满足该条件的点都在该一次函数的直线上。

现在有 $n$ 个点,第 $i$ 个点的坐标为 $(x_i,y_i)$。

现在请你求出,分别有多少点,在给定的一次函数图像上。

形式化地,给出 $n$ 对整数 $(x,y)$,请你求出有多少对数满足 $y=k\times x+b$。

输入格式

输入共 $n+1$ 行。

输入的第一行为三个整数 $n,k,b$。

接下来 $n$ 行,每行两个数 $x_i,y_i$,代表第 $i$ 个点的坐标。

输出格式

输出一行一个整数,代表有多少点在给出的一次函数上(即满足 $y_i = kx_i+b$)。

输入 #1

1
2
3
4
5
6
5 3 0
0 0
1 3
2 7
3 9
-1 -4

输出 #1

1
3

说明/提示

样例 1 解释

给出的一次函数为 $y=3x$。

点 $(0,0)$,$(1,3)$,$(3,9)$ 在一次函数上,共 $3$ 个。

数据点性质

对于 $30\%$ 的测试点,$n=1$; 对于 $100\%$ 的测试点,$1 \le n \le 10^6$,$0 \le |k|,|b| \le 10^5$,$0 \le |x_i|,|y_i| \le 10^9$。


题目分析

解题思路

  1. 首先,我们需要理解题目的核心要求:
    • 给定n个点的坐标(x,y)和一个一次函数y=kx+b
    • 需要判断有多少个点在这条直线上
    • 即满足y=kx+b的点的数量
  2. 解题思路:
    • 对于每个输入的点(x,y),我们只需要判断是否满足y=kx+b这个等式
    • 将x代入方程得到的y值与点的实际y值进行比较
    • 如果相等,说明点在直线上
  3. 具体实现:
    • 读入n、k、b三个参数
    • 循环读入n个点的坐标
    • 对每个点,计算kx+b是否等于y
    • 用计数器统计满足条件的点的数量


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main() {
    // 声明变量n(点的个数)、k(斜率)、b(截距)
    int n, k, b;
    cin >> n >> k >> b;
    // 声明变量x、y用于存储每个点的坐标
    int x, y;
    // ans用于统计在直线上的点的个数
    int ans = 0;
    // 循环读入n个点的坐标
    for (int i = 1; i <= n; i++) {
        cin >> x >> y;
        // 判断点是否在直线y=kx+b上
        if (y == k * x + b) {
            // 如果在直线上,计数器加1
            ans++;
        }
    }
    // 输出在直线上的点的个数
    cout << ans;
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权