【C语言数据结构】集合相似度

题目描述

给定两个整数集合,它们的相似度定义为:N c/N100%。其中N c是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式

输入第一行给出一个正整数N 50),是集合的个数。随后N 行,每行对应一个集合。每个集合首先给出一个正整数M 10 4),是集合中元素的个数;然后跟M 个****0** ,**1** 0**9****区间内的整数。

之后一行给出一个正整数K 2000),随后K 行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例复制

在这里给出一组输入。例如:

复制代码
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%

参考代码:

cpp 复制代码
#include<stdio.h>
typedef struct n
{
	int a[104]={0};//集合
	int M;//集合元素个数
}n;
int main()
{
	n collection[50];
	int N;
	int temp;
	scanf("%d",&N);//集合的个数
	for(int i=0;i<N;i++)//读数据
	{
		scanf("%d",&collection[i].M);
		for(int j=0;j<collection[i].M;j++)
		{
			scanf("%d",&collection[i].a[j]);
		}
	}
	for(int i=0;i<N;i++)//集合内冒泡排序
	{
		temp=0;
		for(int j=0;j<collection[i].M-1;j++)
		{
			for(int k=0;k<collection[i].M-j-1;k++)
			{
				if(collection[i].a[k]>collection[i].a[k+1])
				{
					temp=collection[i].a[k];
					collection[i].a[k]=collection[i].a[k+1];
					collection[i].a[k+1]=temp;
				}
			}
		}
	}
	int cs;//集合比较次数
	scanf("%d",&cs);
	int o,p;//比较的两个集合
	int combine[208]={0};//合并的两个集合
	for(int i=0;i<cs;i++)
	{
		double RC=0.0,RT=0.0;
		scanf("%d %d",&o,&p);
		for(int j=0;j<collection[o-1].M;j++)//找RC--两个集合中相等的个数
		{
			
			if(collection[o-1].a[j]==collection[o-1].a[j+1])//前后相等时直接跳过相等到下一个
			{
				continue;
			}
			for(int k=0;k<collection[p-1].M;k++)
			{
				if(collection[p-1].a[k]==collection[p-1].a[k+1])//前后相等时直接跳过相等到下一个
				{
					continue;
				}
				if(collection[o-1].a[j]==collection[p-1].a[k])
				{
					RC++;
				}
			}
		}
		//printf("%.0lf ",RC);//测试
		
		
		for(int j=0;j<collection[o-1].M;j++)//合并集合元素,计算RT
		{
			combine[j]=collection[o-1].a[j];
		}
		for(int k=0;k<collection[p-1].M;k++)
		{
			combine[k+collection[o-1].M]=collection[p-1].a[k];
		}
		for(int j=0;j<collection[o-1].M+collection[p-1].M-1;j++)
		{
			for(int k=0;k<collection[o-1].M+collection[p-1].M-j-1;k++)
			{
				if(combine[k]>combine[k+1])
				{
					temp=combine[k];
					combine[k]=combine[k+1];
					combine[k+1]=temp;
				}
			}
		}
		for(int j=0;j<collection[o-1].M+collection[p-1].M;j++)
		{
			
			if(combine[j]==combine[j+1])
			{
				continue;
			}
			else
			{
				RT++;
			}
		}
		//printf("%.0lf\n",RT);//测试
		printf("%.2lf",RC/RT*100);
		printf("%\n");
	}
	return 0;
}

解释:

1.其实以上代码并非最简单版本,因为冒泡排序那里可以单独写入一个函数里,方便调用。

2.在问题描述时使用的是NC和NT,以上代码用了替换,NC-->RC,NT-->RT

3.以上代码还用到了比较少用到的结构体数组,主要是觉得方便处理一组一组的数据,方便给数组编号

NO.38

好了,各位小伙伴有什么问题可以评论区见,感谢!

<C语言数据结构>

相关推荐
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing2 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21122 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP3 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN3 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218314 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤4 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate5 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran5 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹5 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统