某位用户的某次上网行为可以建模成一个三元组{用户 ID、开始时间、结束时 间}。给定一组上网行为数据,编写一个函数,按照用户总上网时长降序返回所 有用户 ID。要求编写的函数 func6 的函数原型如下: vector<int> func6(const vector<User_Activity>& activities); 其中,用户自定义类型 User_Activity 的定义如下: struct User_Activity { int id; //用户ID int start_time; //开始时间 int end_time; //结束时间 }; 注意:参数 activities 中一个用户可能有多次上网行为。 比如对于上网行为数据:{1, 0, 10}, {2, 0, 5}, {1, 20, 28}, {3, 0, 20}, {2, 10, 15} 容易看出用户 1 的总上网时长是 10+8=18,用户 2 的总上网时长是 5+5=10,用户 3 的总上网时长是 20。所以最终应该返回的用户 ID 是 3, 1, 2。 此外,你还应该处理输入数据存在问题的情况。正确的数据应该满足 1) 任意一次上网行为的开始时间小于等于结束时间; 2) 任意用户的任意两次上网行为在时间上不重叠。比如{1, 0, 5}, {1, 10, 15}是一 组正确数据,{1, 0, 10}, {1, 10, 15}也是一组正确数据。而{1, 0, 10}, {1, 1, 5}是 一组错误数据,{1, 0, 10}, {1, 5, 15}也是一组错误数据。 如果输入数据存在问题,抛出异常"invalid input" 提示:你可以先处理数据正常情况,测试正确后再考虑数据错误情况。该题目的来源
时间: 2023-06-15 19:06:52 浏览: 71
我将为你提供一个参考解答,该解答使用了 unordered_map 来存储每个用户的总上网时间,并使用了 lambda 表达式来定义排序规则。
```cpp
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <stdexcept>
using namespace std;
struct User_Activity {
int id;
int start_time;
int end_time;
};
vector<int> func6(const vector<User_Activity>& activities) {
// 检查数据是否合法
for (const auto& act1 : activities) {
if (act1.start_time > act1.end_time) {
throw invalid_argument("invalid input");
}
for (const auto& act2 : activities) {
if (act1.id == act2.id && &act1 != &act2 &&
(act1.start_time < act2.end_time && act2.start_time < act1.end_time)) {
throw invalid_argument("invalid input");
}
}
}
// 计算每个用户的总上网时间
unordered_map<int, int> total_times;
for (const auto& act : activities) {
total_times[act.id] += act.end_time - act.start_time;
}
// 按照总上网时间降序排序
vector<pair<int, int>> pairs(total_times.begin(), total_times.end());
sort(pairs.begin(), pairs.end(), [](const pair<int, int>& p1, const pair<int, int>& p2) {
return p1.second > p2.second;
});
// 返回结果
vector<int> result;
for (const auto& p : pairs) {
result.push_back(p.first);
}
return result;
}
```
该函数首先检查输入数据是否合法,如果出现了开始时间大于结束时间或者两个上网行为时间重叠的情况,就抛出异常。然后,使用 unordered_map 来计算每个用户的总上网时间,并将结果存储在 vector<pair<int, int>> 中。最后,按照总上网时间降序排序,并返回用户 ID。
注意,该函数使用了 lambda 表达式来定义排序规则,具体来说,按照 pair 的第二个元素降序排序。