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;
}

posted on 2025-04-23 10:39  LEESOL-cn  阅读(9)  评论(0)    收藏  举报

导航