我写的代码一直有三个测试点错误
原题链接:21184.赛跑2025-04-19 21:02:13
发布于:江苏
和标准题解有思路上的区别,大家可以两者对比这看,防止和我犯相同的错误
#include <iostream>
#include <vector>
using namespace std;
struct Segment {
int speed;
int time;
};
int main() {
int N, M;
cin >> N >> M;
vector<Segment> shSegments(N);
vector<Segment> kcSegments(M);
// 读取SH的数据
for (int i = 0; i < N; ++i) {
cin >> shSegments[i].speed >> shSegments[i].time;
}
// 读取KC的数据
for (int i = 0; i < M; ++i) {
cin >> kcSegments[i].speed >> kcSegments[i].time;
}
int shIndex = 0, kcIndex = 0;
int shTimeLeft = shSegments[shIndex].time;
int kcTimeLeft = kcSegments[kcIndex].time;
int shSpeed = shSegments[shIndex].speed;
int kcSpeed = kcSegments[kcIndex].speed;
int shDistance = 0, kcDistance = 0;
int leadChanges = 0;
int lastState = 0; // 0: 平局, 1: SH领先, 2: KC领先
while (shIndex < N || kcIndex < M) {
// 处理当前时间单位(1秒)
shDistance += shSpeed;
kcDistance += kcSpeed;
// 确定当前状态
int currentState;
if (shDistance > kcDistance) {
currentState = 1;
} else if (shDistance < kcDistance) {
currentState = 2;
} else {
currentState = 0;
}
// 更新变化次数(忽略初始平局)
if (lastState != 0 && currentState != lastState) {
leadChanges++;
}
// 更新最后有效状态(平局不改变最后状态)
if (currentState != 0) {
lastState = currentState;
} else if (lastState == 0) {
// 保持平局状态,直到有新的领先出现
lastState = currentState;
}
// 更新时间剩余并切换段
shTimeLeft--;
kcTimeLeft--;
if (shTimeLeft == 0 && shIndex < N) {
shIndex++;
if (shIndex < N) {
shSpeed = shSegments[shIndex].speed;
shTimeLeft = shSegments[shIndex].time;
} else {
shSpeed = 0; // 后续不再移动
}
}
if (kcTimeLeft == 0 && kcIndex < M) {
kcIndex++;
if (kcIndex < M) {
kcSpeed = kcSegments[kcIndex].speed;
kcTimeLeft = kcSegments[kcIndex].time;
} else {
kcSpeed = 0; // 后续不再移动
}
}
// 双方都完成时退出
if (shIndex >= N && kcIndex >= M) break;
}
cout << leadChanges << endl;
return 0;
}
全部评论 1
1周前 来自 浙江
0下面的三个测试点错误上面的改正之后下面的三个错了
1周前 来自 江苏
0
有帮助,赞一个