【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$。
题目分析
解题思路
- 首先,我们需要理解题目的核心要求:
- 给定n个点的坐标(x,y)和一个一次函数y=kx+b
- 需要判断有多少个点在这条直线上
- 即满足y=kx+b的点的数量
- 解题思路:
- 对于每个输入的点(x,y),我们只需要判断是否满足y=kx+b这个等式
- 将x代入方程得到的y值与点的实际y值进行比较
- 如果相等,说明点在直线上
- 具体实现:
- 读入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 进行授权