• 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
  • 相关阅读:
    linux设置网关修改ip
    Linux Source命令及脚本的执行方式解析
    ARM9 S3C2440 定时器中断
    Linux下配置静态IP地址,设置DNS和主机名
    s3c2440外部中断操作
    vmware中为虚拟机添加硬盘空间
    『SHELL』SHELL脚本执行方式
    WCF开发的几个频骤
    MyEclipse下Axis2插件的下载和安装
    WCF系列(二) 使用配置文件构建和使用WCF服务
  • 原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10548736.html
Copyright © 2020-2023  润新知