(算法练习)——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");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42377217/article/details/104400566