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;
    }
    
  • 相关阅读:
    Windows Store App 主题动画
    Windows Store App 过渡动画
    Windows Store App 控件动画
    Windows Store App 近期访问列表
    Windows Store App 文件选取器
    Windows Store App 访问应用内部文件
    Windows Store App 用户库文件分组
    Windows Store App 获取文件及文件夹列表
    Windows Store App 用户库文件夹操作
    Windows Store App 用户库文件操作
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14696530.html
Copyright © 2011-2022 走看看