【出分前夕】遵循题目的bug解题:只要船租过一次,就可以一直还,不用考虑船的状态,因此暂时不出栈
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
using namespace std;
// 将时间字符串转换为分钟数
int timeToMinutes(const string& time) {
int hour = stoi(time.substr(0, 2));
int minute = stoi(time.substr(3, 2));
return hour * 60 + minute;
}
int main() {
int num; // 船号
char oper; // 租船S(入栈),借船E(出栈)
char time[20]; // 起始时间
vector<stack<string>> boats(101); // 每个元素是一个栈,下标是船号(1~100),对应栈中存储该船开始时间
int cnt = 0;
double total_time = 0; // 租船次数和总时间
while (scanf("%d %c%s", &num, &oper, time) != EOF) {
if (num == -1) {
break; // 输入结束
}
if (num == 0) {
// 输入了0,输出当天的租船次数和平均租船时间
if (cnt == 0) {
printf("0 0\n"); // 如果没有租船记录,输出0 0
}
else {
printf("%d %.0f\n", cnt, total_time / cnt);
}
// 重置数据,清空栈,为下一次输入做准备
cnt = 0;
total_time = 0;
for (int i = 0; i < 101; i++) {
while (!boats[i].empty()) {
boats[i].pop();
}
}
}
if (oper == 'S') {
// 租船操作,压栈
boats[num].push(time);
}
else if (oper == 'E') {
// 还船操作,弹栈并计算时间
if (!boats[num].empty()) {
string start_time = boats[num].top();
// 只要船租过一次,就可以一直还,不用考虑船的状态,因此暂时不出栈
// boats[num].pop();
int start_minutes = timeToMinutes(start_time);
int end_minutes = timeToMinutes(time);
int duration = end_minutes - start_minutes;
total_time += duration;
cnt++; // 成功还船,租船次数加1
}
// 如果栈为空,忽略此次还船操作,不做任何操作
}
}
return 0;
}

京公网安备 11010502036488号