351判断回旋镖的存在、342充电时间总计算——题目思路与知识点总结C++ | 豆包MarsCode AI刷题
351判断回旋镖的存在
原问题
小M正在玩一个几何游戏,给定一个二维平面上的三个点 points,其中每个点用坐标 points[i] = [xi, yi] 表示。如果三点构成一个回旋镖,则返回 true。回旋镖的定义是三点不在一条直线上,并且这三个点互不相同。
请你帮助小M判断这些点是否构成一个回旋镖。
测试样例
样例1:
输入:
points = [[1, 1], [2, 3], [3, 2]]
输出:True
样例2:
输入:
points = [[1, 1], [2, 2], [3, 3]]
输出:False
样例3:
输入:
points = [[0, 0], [1, 1], [1, 0]]
输出:True
问题解构
具体要求
根据给出的三个直角坐标,得到三个平面直角坐标系上的点,判断三个点是否在同一条直线上。
输入输出
输入:
3行2列的二维矩阵,代表三个点。
输出: 逻辑真或逻辑假。
题目类型分析
这是一道典型的数学编程题,主要考察数学的应用,以及将数学逻辑转换成代码的能力。
思路
判断三个点是否能够构成一个回旋镖,即可以通过判断任意两点构成的直线的斜率是否相等,如果相等,则不能构成回旋镖,如果不相等,则可以构成回旋镖。
代码逻辑
- 计算两条直线斜率
- 检查三点是否存在重合情况
- 检查是否在同一直线
代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool solution(vector<vector<int>>& points) {
// write code here
if (points.size()!= 3) {
return false;
}
// 计算两条直线斜率
double slope1 = ((double)(points[1][1] - points[0][1])) / ((double)(points[1][0] - points[0][0]));
double slope2 = ((double)(points[2][1] - points[1][1])) / ((double)(points[2][0] - points[1][0]));
// 检查三点是否存在重合情况
if ((points[0][0] == points[1][0] && points[0][1] == points[1][1]) ||
(points[0][0] == points[2][0] && points[0][1] == points[2][1]) ||
(points[1][0] == points[2][0] && points[1][1] == points[2][1])) {
return false;
}
// 检查是否在同一直线
return abs(slope1 - slope2) > 1e-9;
}
int main() {
vector<vector<int>> v1 = {{1, 1}, {2, 3}, {3, 2}};
vector<vector<int>> v2 = {{1, 1}, {2, 2}, {3, 3}};
vector<vector<int>> v3 = {{0, 0}, {1, 1}, {1, 0}};
cout << (solution(v1) == true) << endl;
cout << (solution(v2) == false) << endl;
cout << (solution(v3) == true) << endl;
return 0;
}
代码解释
因为斜率可能是带小数点的,所以用到double类型计算斜率。
因为是double类型,所以在返回时,不能苛求为0,而是应该判断是不是大于一个很小的数, 所以用是否大于十的负九次方来判断斜率是不是相等。
342充电时间总计算
原问题
小R有n部电脑,每部电脑的电池容量分别为ai。她可以使用两种不同的充电方式来给电脑充电:
- 普通充电:每单位时间为电脑充电x单位的电量。
- 闪充:每单位时间为电脑充电4x单位的电量。
现在,所有电脑的电量都为零。小R希望使用闪充给所有电脑充满电,计算她需要的总充电时间。请保留结果的小数点后两位。
测试样例
样例1:
输入:
n = 4 ,x = 1 ,a = [2, 3, 4, 5]
输出:'3.50'
样例2:
输入:
n = 3 ,x = 2 ,a = [4, 6, 8]
输出:'2.25'
样例3:
输入:
n = 2 ,x = 1 ,a = [10, 5]
输出:'3.75'
问题解构
具体要求
输入一个有n个元素的数组,输入x,计算数组的和与4x相除的结果。
输入输出
输入int类型的n,x,元素个数为n的数组
输出字符串类型的计算结果
题目类型分析
字符串类型转换问题,难点不在数学计算,而在于字符串与数字类型转换。
思路
模块化,编写一个浮点数到字符串转换函数,然后进行正常数学计算。
代码逻辑
一层逻辑
- 构建浮点数到字符串转换函数
- 主函数
二层逻辑
- 构建浮点数到字符串转换函数
- 创建一个字符串流对象
- 将浮点数格式化为固定小数点后两位,并写入字符串流
- 将字符串流转换为字符串并返回
- 主函数
- 计算总充电量
- 计算充电速度
- 总量除以速度
- 浮点数转化为字符串
代码
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
// 构建浮点数到字符串转换函数
string floatToString(double value) {
// 创建一个字符串流对象
ostringstream stream;
// 将浮点数格式化为固定小数点后两位,并写入字符串流
stream << fixed << setprecision(2) << value;
// 将字符串流转换为字符串并返回
return stream.str();
}
// 主函数
string solution(int n, int x, vector<int> a) {
// write code here
string result;
// 计算总充电量
double sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
}
// 计算充电速度
double v = x * 4.0;
// 总量除以速度
double t = sum / v;
// 浮点数转化为字符串
result = floatToString(t);
return result;
}
int main() {
cout << (solution(4, 1, {2, 3, 4, 5}) == "3.50") << endl;
cout << (solution(3, 2, {4, 6, 8}) == "2.25") << endl;
cout << (solution(2, 1, {10, 5}) == "3.75") << endl;
return 0;
}
代码解释
ostringstream类
ostringstream 是 C++ 标准库中的一个类,它是输出字符串流(output string stream)的简称,属于 <sstream> 头文件。ostringstream 类提供了一种将数据格式化为字符串的方式,类似于 ofstream 用于将数据输出到文件,或者 cout 用于将数据输出到控制台。不同的是,ostringstream 会将输出的数据保存到一个字符串中。
主要特点:
ostringstream允许你将各种类型的数据(如整数、浮点数、字符等)以指定的格式转换为字符串,并且该字符串可以通过str()成员函数进行访问。- 它可以通过流操作符(
<<)将数据写入字符串流,并且能够像处理标准输出流一样处理不同类型的数据。 - 通过
ostringstream,你可以灵活地控制数据的格式,例如对浮点数进行设置精度,或者使用宽度、对齐等功能。