zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    2016年 IT 趋势大预测!
    怎样创建合适的告警处理流程?
    如何解决 Java 安全问题?
    程序员:如何成为一个全栈的工程师?
    安全防护:你是否正在追逐一个不可能实现的目标?
    如何使用 Python 创建一个 NBA 得分图?
    如何对 Android 库进行依赖管理?
    减少 WAF 漏报的 8 种方法 !
    第69节:Java中数据库的多表操作
    第69节:Java中数据库的多表操作
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14696530.html
Copyright © 2011-2022 走看看