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;
}
posted @ 2021-04-24 11:35  Dazzling!  阅读(174)  评论(0编辑  收藏  举报