计算时间区间的贡献值,若同一时间有多个应用程序,均分贡献值,每个vector表示一个应用的开始,结束时间段(一个应用可能有多个时间段)
考虑:
1,区间重叠,均分贡献值
2,浮点数计算,用整型处理单个时间会去掉小数,累计起来就错了
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
vector<int> helper(vector<vector<int>>& wakeLock) {
vector<int> res;
if (wakeLock.empty()) {
return res;
}
int l = wakeLock[0].front();
int r = wakeLock[0].back();
for (int i = 0; i < wakeLock.size(); ++i) {
l = min(l, wakeLock[i].front());
r = max(r, wakeLock[i].back());
}
int n = r - l + 1;
vector<int> nums(n);
for (int i = 0; i < wakeLock.size(); ++i) {
for (int j = 0; j < wakeLock[i].size(); j += 2) {
int k = wakeLock[i][j] - l;
while (k < wakeLock[i][j + 1] - l) {
nums[k++]++;
}
}
}
for (int i = 0; i < wakeLock.size(); ++i) {
double temp = 0;
for (int j = 0; j < wakeLock[i].size(); j += 2) {
int k = wakeLock[i][j] - l;
while (k < wakeLock[i][j + 1] - l) {
temp += (1.0 /nums[k++]);
}
}
res.push_back(temp);
}
return res;
}
int main() {
vector<vector<int>> wakeLock = { {1234, 1238}, {1236, 1238, 1240, 1245} };
vector<int> res;
res = helper(wakeLock);
for (int i = 0; i < res.size(); ++i) {
cout << res[i] << endl;
}
return 0;
}