团体程序设计天梯赛-练习集 L2-005

来源:互联网 发布:cf有刷枪软件吗 编辑:程序博客网 时间:2024/04/30 19:02

超时代码:

1.

#include <cstdio>#include <algorithm>#include <set>using namespace std;int n, m;int num[55], numset[55][10005];void print() {    for (int i=0; i<n; i++)        printf("%d ", num[i]);    puts("");    for (int i=0; i<n; i++)        for (int j=0; j<num[i]; j++)            printf("%d%c", numset[i][j],                   j==num[i]-1?'\n':' ');}int main(){    //freopen("in.txt", "r", stdin);    scanf("%d", &n);    for (int i=0; i<n; i++) {        scanf("%d", &num[i]);        for (int j=0; j<num[i]; j++)            scanf("%d", &numset[i][j]);    }    for (int i=0; i<n; i++) {        sort(numset[i], numset[i]+num[i]);        int ptr=1;        for (int j=1; j<num[i]; j++) {            if (numset[i][j]==numset[i][j-1])                continue;            numset[i][ptr++]=numset[i][j];        }        num[i]=ptr;    }    scanf("%d", &m);    int a, b;    for (int i=0; i<m; i++) {        scanf("%d%d", &a, &b);        a--;        b--;        int cnt=0;        for (int j=0; j<num[a]; j++) {            int l=0, r=num[b]-1;            int tb=numset[a][j];            while (l<=r) {                int mid=(l+r)>>1;                int ta=numset[b][mid];                if (ta==tb) {                    cnt++;                    break;                } else if (ta>tb) {                    r=mid-1;                } else {                    l=mid+1;                }            }        }        set<int> s;        for (int i=0; i<num[a]; i++)            s.insert(numset[a][i]);        for (int i=0; i<num[b]; i++)            s.insert(numset[b][i]);        double res=(double)cnt/s.size();        res*=100;        printf("%.2lf", res);        puts("%");    }    return 0;}


2.

#include <cstdio>#include <set>#include <algorithm>using namespace std;#define all(x) x.begin(), x.end()#define ins(x) inserter(x, x.begin())int n, m;set<int> numset[55];int main(){    //freopen("in.txt", "r", stdin);    scanf("%d", &n);    for (int i=0; i<n; i++) {        int num;        scanf("%d", &num);        for (int j=0; j<num; j++) {            int temp;            scanf("%d", &temp);            numset[i].insert(temp);        }    }    scanf("%d", &m);    for (int i=0; i<m; i++) {        int a, b;        scanf("%d%d", &a, &b);        a--;        b--;        set<int> t1, t2;        set_intersection(all(numset[a]), all(numset[b]), ins(t1));        set_union(all(numset[a]), all(numset[b]), ins(t2));        double res=(double)t1.size()/t2.size();        res*=100;        printf("%.2lf", res);        puts("%");    }    return 0;}


AC代码:

#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int num[55], numset[55][10005], tot[500005], ha[55][10005], vis[500005];
int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d", &num[i]);
        for (int j=0; j<num[i]; j++)
            scanf("%d", &numset[i][j]);
        sort(numset[i], numset[i]+num[i]);
        num[i]=unique(numset[i], numset[i]+num[i])-numset[i];
    }
    int cnt=0;
    for (int i=0; i<n; i++)
        for (int j=0; j<num[i]; j++)
            tot[cnt++]=numset[i][j];
    sort(tot, tot+cnt);
    cnt=unique(tot, tot+cnt)-tot;
    for (int i=0; i<n; i++)
        for (int j=0; j<num[i]; j++)
            ha[i][j]=lower_bound(tot, tot+cnt, numset[i][j])-tot;
    scanf("%d", &m);
    for (int i=1; i<=m; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        a--;
        b--;
        int up=0, down=num[a];
        for (int j=0; j<num[a]; j++)
            vis[ha[a][j]]=i;
        for (int j=0; j<num[b]; j++)
            if (vis[ha[b][j]]==i)
                up++;
            else
                down++;
        double res=(double)up/down;
        res*=100;
        printf("%.2lf", res);
        puts("%");
    }
    return 0;
}

0 0
原创粉丝点击