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%%\n",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%%\n",res[a][b]*100);
    }
    //system("pause");
    return 0;
}
posted @ 2021-02-17 12:07  Dazzling!  阅读(13)  评论(0编辑  收藏  举报