|
楼主 |
发表于 2024-9-30 16:26:46
|
显示全部楼层
- // 辅助函数:找到向量中第二大的值和第三大的值
- static std::pair<double, double> findSecondAndThirdLargest(const std::vector<double>& vec) {
- if (vec.size() < 3) {
- throw std::runtime_error("Vector must contain at least three elements.");
- }
- // 创建一个副本并排序
- std::vector<double> sortedVec = vec;
- std::sort(sortedVec.begin(), sortedVec.end(), std::greater<double>());
- // 去除重复元素
- auto last = std::unique(sortedVec.begin(), sortedVec.end());
- sortedVec.erase(last, sortedVec.end());
- // 确保至少有三个不同的元素
- if (sortedVec.size() < 3) {
- throw std::runtime_error("Vector must contain at least three unique elements.");
- }
- // 返回第二大的值和第三大的值
- return { sortedVec[1], sortedVec[2] };
- }
- // 检查矩阵 info 的每行和每列是否满足条件
- static bool checkMatrix(const std::vector<std::vector<double>>& info, double n) {
- size_t rows = info.size();
- if (rows == 0) return false; // 如果矩阵为空,直接返回 false
- size_t cols = info[0].size();
- // 检查行
- for (const auto& row : info) {
- try {
- auto [second, third] = findSecondAndThirdLargest(row);
- if (second <= n * third) {
- return false; // 第二大的值不大于第三大的值n倍
- }
- }
- catch (const std::exception& e) {
- // 处理异常(如行中元素不足或不唯一)
- return false;
- }
- }
- // 检查列
- for (size_t col = 0; col < cols; ++col) {
- std::vector<double> column;
- for (size_t row = 0; row < rows; ++row) {
- column.push_back(info[row][col]);
- }
- try {
- auto [second, third] = findSecondAndThirdLargest(column);
- if (second <= n * third) {
- return false; // 第二大的值不大于第三大的值n倍
- }
- }
- catch (const std::exception& e) {
- // 处理异常(如列中元素不足或不唯一)
- return false;
- }
- }
- return true; // 所有行和列都满足条件
- }
复制代码 |
|