站外题TLE求调
查看原帖
站外题TLE求调
1350596
Mitchell_Dracula楼主2025/1/6 17:15

题目描述

给出两个数集,它们的相似程度定义为 Nc/Nt×100。其中,Nc 表示两个数集中相等的、两两互不相同的元素个数,而 Nt 表示两个数集中总共的互不相同的元素个数。请计算任意两个给出数集的相似程度。

输入

第一行一个正整数 N(N≤50),表示数集的个数。

接下来的 N 行,每行首先给出一个正整数 M(M≤10000),之后给出的 M 个正整数为此数集中的元素(可能有重复,小于或等于 10^6)。

在这些数集之后,给出一行一个正整数 K(K≤2000) 表示询问的个数。

之后的 K 行,每行两个正整数 x 和 y,表示询问 x 数集与 y 数集的相似程度。每一行中输入的各个整数之间由一个空格隔开。

输出

对于每一个询问,输出一行一个百分数,为两个数集的相似程度,保留一位小数。

样例输入

3

3 99 87 101

4 87 101 5 87

7 99 101 18 5 135 18 99

2

1 2

1 3

样例输出

50.00%

33.33%

我的代码:

//set <int> s
//s.begin()//返回 s 的第一个元素位置
//s.count(w)//返回集合中w的数量
//s.end()返回 s 的最后一个元素位置
//s.empty()//检查容器是否为空
//s.size()//返回元素数
//s.insert(w)//向容器中插入 w 这个元素
//s.erase(w)//在容器中删除 w 这个元素
//s.clear()//将 s 清空
//swap(s1,s2)//交换 s1 与 s2 两个容器内的元素
//s.find(w)//在容器中查找 w 这个元素所在的位置
//s.lower_bound(w)//在容器中寻找第一个不小于 w 的元素位置
//遍历set:for(set<int>::iterator it=s.begin();it!=s.end();it++) ,使用时一般为*it 
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k,x,y;
set <int> s[105];
int main(){
//	freopen("set.in","r",stdin);
//	freopen("set.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&m);
		while(m--){
			scanf("%d",&t);
			s[i].insert(t);	
		}
	}
	scanf("%d",&k);
	while(k--){
		scanf("%d%d",&x,&y);
		int lenx=s[x].size(),leny=s[y].size(),sum=0;
		for(set<int>::iterator it=s[x].begin();it!=s[x].end();it++)if(s[y].count(*it))sum++;
		printf("%.2f",1.0*sum*100/(lenx+leny-sum));
		printf("%\n");
	}
//	fclose(stdin);fclose(stdout);
	return 0;
}

TLE27分

2025/1/6 17:15
加载中...