这周都在划水啦
接下来还是要好好补题才行呢
明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了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%。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入格式:
输入第一行给出一个正整数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啦