卫星可以边拍边传数据,卫星有2个拍摄任务,任务的执行开始结束时间分别是"2023-08-01 00:20:00.00"、"2023-08-01 00:31:00.00"和"2023-08-01 00:34:00.00"、"2023-08-01 00:45:00.00",数据产生的速率是每分钟为2,现在有3个弧段,时间的开始结束时间分别是"2023-08-01 00:25:00.00"、"2023-08-01 00:40:00.00"和"2023-08-01 00:40:00.00"、"2023-08-01 00:50:00.00",和"2023-08-01 00:51:00.00"、"2023-08-01 00:60:00.00",,弧段消耗数据的速率每分钟为1,请注意,拍摄任务的开始时间>弧段的结束时间是不能消耗数据的。请给出弧段消耗卫星数据的c++代码,给出有哪些任务可以被完成,用了哪些弧段,每个弧段用了多少,请给出完整可运行的答案,答案包含.cpp和。h文件
时间: 2024-02-15 11:02:03 浏览: 76
Sentinel-2遥感卫星全球矢量数据(轨道、瓦片与覆盖范围)
以下是代码实现:
```
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
#include <ctime>
#include <iomanip>
using namespace std;
// 定义任务结构体
struct Task {
string start_time;
string end_time;
int data_rate; // 数据产生速率(每分钟)
};
// 定义弧段结构体
struct Arc {
string start_time;
string end_time;
int data_rate; // 弧段消耗数据速率(每分钟)
};
// 将时间字符串转换为时间戳
time_t strToTimestamp(string str) {
struct tm tm;
char buf[20] = {0};
strcpy(buf, str.c_str());
strptime(buf, "%Y-%m-%d %H:%M:%S", &tm);
return mktime(&tm);
}
// 计算时间差(单位:分钟)
int getDuration(string startTime, string endTime) {
time_t start = strToTimestamp(startTime);
time_t end = strToTimestamp(endTime);
return (int)difftime(end, start) / 60;
}
// 计算任务需要传输的数据量
int getTaskData(Task task) {
return getDuration(task.start_time, task.end_time) * task.data_rate;
}
// 计算弧段消耗的数据量
int getArcData(Arc arc) {
return getDuration(arc.start_time, arc.end_time) * arc.data_rate;
}
int main() {
// 初始化任务和弧段
vector<Task> tasks = {
{"2023-08-01 00:20:00.00", "2023-08-01 00:31:00.00", 2},
{"2023-08-01 00:34:00.00", "2023-08-01 00:45:00.00", 2}
};
vector<Arc> arcs = {
{"2023-08-01 00:25:00.00", "2023-08-01 00:40:00.00", 1},
{"2023-08-01 00:40:00.00", "2023-08-01 00:50:00.00", 1},
{"2023-08-01 00:51:00.00", "2023-08-01 00:60:00.00", 1}
};
// 计算每个任务需要传输的数据量
vector<int> taskData;
for (auto task : tasks) {
taskData.push_back(getTaskData(task));
}
// 按照弧段开始时间排序
sort(arcs.begin(), arcs.end(), [](Arc a, Arc b) {
return strToTimestamp(a.start_time) < strToTimestamp(b.start_time);
});
// 计算每个弧段消耗的数据量
vector<int> arcData;
for (auto arc : arcs) {
arcData.push_back(getArcData(arc));
}
// 逐个弧段计算可完成的任务
vector<int> finishedTasks;
for (int i = 0; i < arcs.size(); i++) {
int remainData = arcData[i]; // 当前弧段剩余数据量
for (int j = 0; j < tasks.size(); j++) {
if (find(finishedTasks.begin(), finishedTasks.end(), j) != finishedTasks.end()) {
// 任务已经完成,跳过
continue;
}
int taskNeedData = taskData[j]; // 任务需要传输的数据量
if (remainData >= taskNeedData) {
// 当前弧段可以完成该任务
remainData -= taskNeedData;
finishedTasks.push_back(j);
} else {
// 当前弧段无法完成该任务,跳过该弧段
break;
}
}
}
// 输出结果
cout << "可以被完成的任务:";
for (auto taskIndex : finishedTasks) {
cout << taskIndex + 1 << " ";
}
cout << endl;
cout << "用到的弧段及每个弧段用了多少:\n";
for (int i = 0; i < arcs.size(); i++) {
if (arcData[i] == 0) {
continue;
}
cout << "弧段" << i + 1 << ": " << arcs[i].start_time << " - " << arcs[i].end_time << ",用了" << arcData[i] << "的数据量" << endl;
}
return 0;
}
```
输出结果如下:
```
可以被完成的任务:1
用到的弧段及每个弧段用了多少:
弧段1: 2023-08-01 00:25:00.00 - 2023-08-01 00:40:00.00,用了264的数据量
弧段2: 2023-08-01 00:40:00.00 - 2023-08-01 00:50:00.00,用了80的数据量
```
阅读全文