1063 Set Similarity (25 分)

原代码,在(color{deepskyblue}{PAT})上能取得(25pts)的满分好成绩,但在其他地方都超时了,gg。

set<int> S[55];
double res[55][55];
int n,m;

void init()
{
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        {
            set<int> tot;
            set<int> common;
            for(auto t:S[i]) tot.insert(t);
            for(auto t:S[j])
            {
                if(S[i].count(t)) common.insert(t);
                tot.insert(t);
            }
            res[i][j]=1.0*common.size()/tot.size();
        }
}

int main()
{
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        int k;
        scanf("%d",&k);
        for(int j=0;j<k;j++)
        {
            int x;
            scanf("%d",&x);
            S[i].insert(x);
        }
    }

    init();

    cin>>m;

    while(m--)
    {
        int a,b;
        cin>>a>>b;
        printf("%.1f%%
",res[a][b]*100);
    }
    //system("pause");
    return 0;
}

思考一下,对代码简化一下就可以在其他地方过辣。

set<int> S[55];
double res[55][55];
int n,m;

void init()
{
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        {
            int nc=0;
            for(auto t:S[i]) nc+=S[j].count(t);
            int nt=S[i].size()+S[j].size()-nc;
            res[i][j]=1.0*nc/nt;
        }
}

int main()
{
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        int k;
        scanf("%d",&k);
        for(int j=0;j<k;j++)
        {
            int x;
            scanf("%d",&x);
            S[i].insert(x);
        }
    }

    init();

    cin>>m;

    while(m--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%.1f%%
",res[a][b]*100);
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14408562.html