第二天 关于复习整理

这周都在划水啦

接下来还是要好好补题才行呢

明明的随机数

题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式
有2行,第1行为1个正整数,表示所生成的随机数的个数:N

第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式
2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例
输入 #1

10
20 40 32 67 40 20 89 300 400 15

输出 #1

8
15 20 32 40 67 89 300 400

①这道题如果无脑的话就直接用set了那可是真香
②考虑冒泡排序,选择排序等O(n^2)的排序,虽然很麻烦,但是不熟练还是心里很慌呢,还是抽空要多练习
计数排序
我们发现每个数的大小非常集中,可以采用计数排序的方式排序,在每个数的范围很小时,将时间复杂度降至 O(n),在数据范围进一步扩大时可以采用。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
using namespace std;
#define pb push_back
typedef long long ll;
int n;
int a[1010]; 
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		a[x]++;
	}
	int cnt=0;
	for(int i=1;i<=1000;i++){
		if(a[i]>0) cnt++; 
	}
	printf("%d\n",cnt);
	bool first=true;
	for(int i=1;i<=1000;i++){
		if(a[i]){
			if(first) first=false;
			else cout<<' ';
			cout<<i;
		}
	}	
	printf("\n");
	return 0;
}

STL之set

7-11 集合相似度 (25 分)
给定两个整数集合,它们的相似度定义为:Nc/Nt ×100%。其中N​c是两个集合都有的不相等整数的个数N​t是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:
输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤10^4 ),是集合中元素的个数;然后跟M个[0,10 ^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%

别的不多说先放代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll> s[55];

int main()
{
	int n,m;
	cin>>n;
	 
	for(int i=1;i<=n;i++){
		cin>>m;
		ll a;
		for(int j=0;j<m;j++){
			scanf("%lld",&a);
			s[i].insert(a);
		}
	}
	int k;
	cin>>k;
	while(k--){
		int a,b;
		scanf("%d %d",&a,&b);
		int cnt=0; 
		set<ll>::iterator it; 
		for(it=s[a].begin();it!=s[a].end();it++){
			if(s[b].count(*it)){
				cnt++;
			}
		}
		printf("%.2f%\n",cnt*1.0/(s[a].size()+s[b].size()-cnt)*100);
	}
	return 0;
}

比较不熟练的是这段代码啦

	if(s[b].count(*it)){
		cnt++;
	}

count就是记录个数,如果这个数出现过的话 cnt就++;

printf("%.2f%\n",cnt*1.0/(s[a].size()+s[b].size()-cnt)*100);

最后就是输出符合题意 题意有时候可真难理解啊 淦

今天就先这样 88啦

发布了16 篇原创文章 · 获赞 0 · 访问量 121

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/103341175