set容器运行超时+set的find函数(若在set a 中找不到则a.find(x)=a.end())

1063 Set Similarity (25分)

Given two sets of integers, the similarity of the sets is defined to be N​c​​/N​t​​×100%, where N​c​​ is the number of distinct common numbers shared by the two sets, and N​t​​ is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.

Input Specification:

Each input file contains one test case. Each case first gives a positive integer N (≤50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (≤10​4​​) and followed by M integers in the range [0,10​9​​]. After the input of sets, a positive integer K (≤2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.

Output Specification:

For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.

Sample Input:

3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

Sample Output:

50.0%
33.3%

质朴的算法会导致运行超时:set3=set1+set2,ans=( set1.size() + set2.size() - set3.size() ) / ( set1.size()+set2.size() ).

#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
#include<string.h>
#include<iostream>
#include<set>
using namespace std;
//15:25
set<long long int> a[55];
void calcu(int x,int y){
    /*set中数据合格
    for(set<long long int>::iterator it=a[x].begin();it!=a[x].end();it++)
        printf("%lld ",*it);
    printf("\n");
    for(set<long long int>::iterator it=a[y].begin();it!=a[y].end();it++)
        printf("%lld ",*it);
    printf("\n");
    */
    int sum=a[x].size()+a[y].size();
    set<long long int> tmp1=a[x];
    set<long long int> tmp2=a[y];
    for(set<long long int>::iterator it=a[y].begin();it!=a[y].end();it++){
        tmp1.insert(*it);
    }
    int nc=sum-tmp1.size();
    float ans=(float)nc/tmp1.size();
    printf("%.1f%\n",ans*100);
    return ;
}
int main(){
    int n,k;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        long long int tmp;
        scanf("%d",&x);
        for(int j=0;j<x;j++){
            scanf("%lld",&tmp);
            a[i].insert(tmp);
        }
    }
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        calcu(x,y);
    }
    return 0;
}
/*
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99


2

1 2
87 99 101
5 87 101

1 3
87 99 101
5 18 99 101 135
*/

聪明的做法是,直接用set 的find函数!

#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
#include<string.h>
#include<iostream>
#include<set>
using namespace std;
//15:25
set<long long int> a[55];
void calcu(int x,int y){
    /*set中数据合格
    for(set<long long int>::iterator it=a[x].begin();it!=a[x].end();it++)
        printf("%lld ",*it);
    printf("\n");
    for(set<long long int>::iterator it=a[y].begin();it!=a[y].end();it++)
        printf("%lld ",*it);
    printf("\n");
    */
    int common=0,sum=a[x].size()+a[y].size();
    for(set<long long int>::iterator it=a[x].begin();it!=a[x].end();it++){
        if(a[y].find(*it)!=a[y].end())
            common++;
    }
    float ans=(float)common/(sum-common);
    printf("%.1f%\n",ans*100);
    return ;
}
int main(){
    int n,k;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        long long int tmp;
        scanf("%d",&x);
        for(int j=0;j<x;j++){
            scanf("%lld",&tmp);
            a[i].insert(tmp);
        }
    }
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        calcu(x,y);
    }
    return 0;
}
/*
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99


2

1 2
87 99 101
5 87 101

1 3
87 99 101
5 18 99 101 135
*/

猜你喜欢

转载自blog.csdn.net/ur_ytii/article/details/112748885