zoukankan      html  css  js  c++  java
  • 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磁盘空间被未知资源耗尽
    磁盘的分区、格式化、挂载(转)
    sp_MSforeachtable和sp_MSforeachdb
    分布式缓存系统 Memcached 【转载】
    在性能计数的时候使用StopWatch类型
    数据库设计阶段中为何要考虑“反规范化”
    再谈谈数据库镜像之客户端重定向
    当SQL Server排序时遇上了NULL值
    ArrayList的动态扩展
    SSMS 2008的智能感知仅仅针对SQL Server 2008的数据库有效
  • 原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10548736.html
Copyright © 2011-2022 走看看