A1046. Shortest Distance(20)

17/20,部分超时。

#include<bits/stdc++.h>
using namespace std;
int N,x,pairs;
int a,b;
vector<int> dist;
void input(){
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>x;
        dist.push_back(x);
    }
}
void solve(){
    cin>>pairs;
    for(int i=0;i<pairs;i++){
        cin>>a>>b;
        int sum1=0;
        int sum2=0;
        int sum=0;
        if(a==b)cout<<0<<endl;
        else if(a<b){
            for(int j=a-1;j<b-1;j++)sum1+=dist[j];
            for(int j=b-1;j<5;j++)sum2+=dist[j];
            for(int j=0;j<a-1;j++)sum2+=dist[j];
        }
        else{
            for(int j=a-1;j<5;j++)sum1+=dist[j];
            for(int j=0;j<b-1;j++)sum1+=dist[j];
            for(int j=b-1;j<a-1;j++)sum2+=dist[j];
        }
        sum=(sum1<sum2)?sum1:sum2;
        cout<<sum<<endl;
    }
}
int main(){
    input();
    solve();
    return 0;
}

改进下,顺时针与逆时针路径之和是总路径长度,所以可以简化求sum2的方式。不过依旧超时17/20

#include<bits/stdc++.h>
using namespace std;
int N,x,pairs;
int a,b;
vector<int> dist;
int sum=0;
void input(){
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>x;
        dist.push_back(x);
        sum+=x;
    }
}
void solve(){
    cin>>pairs;
    for(int i=0;i<pairs;i++){
        cin>>a>>b;
        int sum1=0;
        int sum2=0;

        if(a==b)cout<<0<<endl;
        else if(a<b){
            for(int j=a-1;j<b-1;j++)sum1+=dist[j];
            sum2=sum-sum1;
        }
        else{
            for(int j=a-1;j<5;j++)sum1+=dist[j];
            for(int j=0;j<b-1;j++)sum1+=dist[j];
            sum2=sum-sum1;
        }
        cout<<((sum1<sum2)?sum1:sum2)<<endl;
    }
}
int main(){
    input();
    solve();
    return 0;
}

以上代码会超时是因为我们每次求两个结点的最短距离,都进行一次累加计算,每次查询就要遍历数组也就是10的5次方,而又有10的4次方次操作,所有共10的9次方。
我们需要通过记忆化来对最短距离存储,但是怎么存呢?
方案1:通过二维数组,array[low][high]
方案2:通过map,map<(low,high),int>
方案3:计算出1到其他结点顺时针的距离,通过差值计算两点最短距离。
事实证明方案3更好。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int N,x,pairs;
int a,b;
int dist[MAXN],A[MAXN];//A用来存放i到i+1之间的距离。Dist来存放结点1到结点i顺时针下个结点的距离。
int sum=0;
void input(){
    cin>>N;
    for(int i=1;i<=N;i++){
        cin>>x;
        A[i]=x;
        sum+=x;
        dist[i]=sum;
    }
}
void solve(){
    cin>>pairs;
    for(int i=0;i<pairs;i++){
        cin>>a>>b;
    if(a>b)swap(a,b);
    int temp=dist[b-1]-dist[a-1];
    cout<<min(temp,sum-temp)<<endl;
    }
}
int main(){
    input();
    solve();
    return 0;
}
keep going
原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10548736.html