PAT甲级——1046 Shortest Distance——分数 20
题目

求一个圆环中,两点的最短距离
正确解法
点击查看代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N; scanf("%d",&N);
vector<int> distances(N);
vector<int> prefix(N + 1); // prefix[i] 表示前 i 段的距离之和(i 从 1 开始)
// 读取距离并构建前缀和
for (int i = 0; i < N; ++i) {
scanf("%d", &distances[i]);
prefix[i + 1] = prefix[i] + distances[i];
}
int totalDistance = prefix[N]; // 总环路距离
int M;
cin >> M;
while (M--) {
int a, b;scanf("%d %d", &a, &b);
if (a > b) swap(a, b); // 保证 a < b
int forward = prefix[b - 1] - prefix[a - 1];
int backward = totalDistance - forward;
printf("%d\n",min(forward, backward));
}
return 0;
}
17分解法(超时)
点击查看代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
int N; scanf("%d",&N);
vector<int> distances(N);
for(int i =0;i<N;i++){
scanf("%d",&distances[i]);
}
int M; scanf("%d",&M);
while(M--){
int a,b; scanf("%d %d",&a,&b);
int ans = 0;
if(a < b){
// 正向走
int forward = 0;
for(int i =a-1;i<b-1;i++){
forward += distances[i];
}
// 反向走
int backward = 0;
for(int i =b-1;i<N;i++){
backward += distances[i];
if(backward > forward) break;
}
if(forward > backward){
for(int i =0;i<a-1;i++){
if(backward > forward) break;
backward += distances[i];
}
}
ans = min(forward,backward);
}else{
// 正向走
int forward = 0;
for(int i =b-1;i<a-1;i++){
forward += distances[i];
}
// 反向走
int backward = 0;
for(int i =a-1;i<N;i++){
backward += distances[i];
if(backward > forward) break;
}
if(forward > backward){
for(int i =0;i<b-1;i++){
if(backward > forward) break;
backward += distances[i];
}
}
ans = min(forward,backward);
}
cout<<ans<<endl;
}
return 0;
}
浙公网安备 33010602011771号