(算法练习)——STL容器set的使用

要求:
http://codeup.cn/problem.php?cid=100000597&pid=0
2020.2.20更新~用了find,代码AC了。
事实证明昨天那种简单粗暴使用新的set将两个set整合到一起的做法很耗内存,虽然省时间,find查找时间复杂度相对于暴力查找稍稍优越点,但不必开拓新的空间(难得时间换空间。。。)

在这里插入图片描述
AC代码:

#include <stdio.h>
#include <set>
#include <iostream>
using namespace std;

int main(){
	set<int>jihe[55];
	//set<int>chuli[2010];
	int N,M,K;  //集合数、集合中元素数、要查询的集合对数 
	scanf("%d",&N);
	int num;   //每个集合中的元素 
	for(int i = 1;i <=N;i++){
		scanf("%d",&M);
		for(int j = 0;j <M;j++){
			scanf("%d",&num);
			jihe[i].insert(num);
		}
	}
	scanf("%d",&K);
	int a,b;
	double ans[2010];   //存结果的数组 
	for(int i = 0;i <K;i++){
		scanf("%d %d",&a,&b);
		int same = 0,different = 0;
		for(set<int>::iterator it = jihe[a].begin();it != jihe[a].end();it++){   //set不能用下标访问,坑 
			set<int>::iterator is = jihe[b].find(*it);
			
			if(is != jihe[b].end()){    //set没find到的话会返回end(),所以不能用*is>0这样简单判断 
				same++;
			}
			else{
				different++;
				//printf("不同 ");
			}
		}
		double percent;
		percent = (double)(same)/(jihe[b].size()+different);
		ans[i] = percent;	
	}
	char aa = '%';
	for(int i = 0;i <K;i++){
		printf("%.1f%c",ans[i]*100,aa);
		if(i <K-1){
			printf("\n");
		}
	}
}

————————————————————分割线——————————

今晚做三题错两题也是醉了。。。

(没AC)代码:

#include <stdio.h>
#include <set>
#include <iostream>
using namespace std;

int main(){
	set<int>jihe[55];
	set<int>chuli[2010];
	int N,M,K;  //集合数、集合中元素数、要查询的集合对数 
	scanf("%d",&N);
	int num;   //每个集合中的元素 
	for(int i = 1;i <=N;i++){
		scanf("%d",&M);
		for(int j = 0;j <M;j++){
			scanf("%d",&num);
			jihe[i].insert(num);
		}
	}
	scanf("%d",&K);
	int a,b;
	double ans[2010];   //存结果的数组 
	for(int i = 0;i <K;i++){
		scanf("%d %d",&a,&b);
		for(set<int>::iterator it = jihe[a].begin();it != jihe[a].end();it++){   //set不能用下标访问,坑 
			chuli[i].insert(*it);
		}
		for(set<int>::iterator it = jihe[b].begin();it != jihe[b].end();it++){
			chuli[i].insert(*it);
		}
		double percent;
		percent = (double)(jihe[a].size()+jihe[b].size()-chuli[i].size())/(chuli[i].size());
		ans[i] = percent;	
	}
	char aa = '%';
	for(int i = 0;i <K;i++){
		printf("%.1f%c",ans[i]*100,aa);
		if(i <K-1){
			printf("\n");
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值