• L2-028 秀恩爱分得快 (25 分)


    首先写了个较为暴力的代码。

    const int N=1010;
    bool sex[N];
    double sum[N][N];
    int n,m;
    
    void print(int a,int b)
    {
        if(!sex[a]) cout<<'-';
        cout<<a<<' ';
        if(!sex[b]) cout<<'-';
        cout<<b<<endl;
    }
    
    int main()
    {
        cin>>n>>m;
    
        while(m--)
        {
            int k;
            cin>>k;
            vector<int> a(k);
            for(int i=0;i<k;i++)
            {
                string s;
                cin>>s;
                a[i]=stoi(s);
                a[i]=abs(a[i]);
                if(s[0] == '-') sex[a[i]]=false;
                else sex[a[i]]=true;
            }
    
            for(int i=0;i<k;i++)
                for(int j=i+1;j<k;j++)
                {
                    sum[a[i]][a[j]]+=1.0/k;
                    sum[a[j]][a[i]]+=1.0/k;
                }
        }
    
        int a,b;
        cin>>a>>b;
        a=abs(a),b=abs(b);
        double maxa=0,maxb=0;
        for(int i=0;i<n;i++)
        {
            maxa=max(maxa,sum[a][i]);
            maxb=max(maxb,sum[b][i]);
        }
    
        if(maxa == sum[a][b] && maxb == sum[b][a])
            print(a,b);
        else
        {
            for(int i=0;i<n;i++)
                if(sum[a][i] == maxa && sex[a] != sex[i])
                    print(a,i);
    
            for(int i=0;i<n;i++)
                if(sum[b][i] == maxb && sex[b] != sex[i])
                    print(b,i);
        }
    
        //system("pause");
        return 0;
    }
    

    可以发现复杂度的量级为:(O(MK^2)),其中(M)的量级为(1000)(k)的量级为$500%,显然时间上不能完全通过此题。

    考虑优化:
    由于只会询问异性之间的亲密度,所以我们只需累加异性之间的亲密度,而上述代码即累加了异性又累加了同性。

    const int N=1010;
    bool sex[N];
    double sum[N][N];
    int n,m;
    
    void print(int a,int b)
    {
        if(!sex[a]) cout<<'-';
        cout<<a<<' ';
        if(!sex[b]) cout<<'-';
        cout<<b<<endl;
    }
    
    int main()
    {
        cin>>n>>m;
    
        while(m--)
        {
            int k;
            cin>>k;
            vector<int> a(k);
            vector<int> gender[2];
            for(int i=0;i<k;i++)
            {
                string s;
                cin>>s;
                a[i]=stoi(s);
                a[i]=abs(a[i]);
                if(s[0] == '-')
                {
                    sex[a[i]]=false;
                    gender[0].pb(a[i]);
                }
                else
                {
                    sex[a[i]]=true;
                    gender[1].pb(a[i]);
                }
            }
    
            for(int i=0;i<gender[0].size();i++)
                for(int j=0;j<gender[1].size();j++)
                {
                    int x=gender[0][i],y=gender[1][j];
                    sum[x][y]+=1.0/k;
                    sum[y][x]+=1.0/k;
                }
        }
    
        int a,b;
        cin>>a>>b;
        a=abs(a),b=abs(b);
        double maxa=0,maxb=0;
        for(int i=0;i<n;i++)
        {
            maxa=max(maxa,sum[a][i]);
            maxb=max(maxb,sum[b][i]);
        }
    
        if(maxa == sum[a][b] && maxb == sum[b][a])
            print(a,b);
        else
        {
            for(int i=0;i<n;i++)
                if(sum[a][i] == maxa)
                    print(a,i);
    
            for(int i=0;i<n;i++)
                if(sum[b][i] == maxb)
                    print(b,i);
        }
    
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    Servlet学习总结,为理解SpringMVC底层做准备
    maven笔记
    初识Hadoop
    java8笔记: sorted()之正序倒序
    git push命令
    git clone新项目后如何拉取其他分支代码到本地
    Spring事务
    线程之间的转化状态
    Centos安装RabbitMq
    .net 中的AES加密解密
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14696530.html
Copyright © 2020-2023  润新知