要求:
http://codeup.cn/problem.php?cid=100000597&pid=0
2020.2.20更新~用了find,代码AC了。
事实证明昨天那种简单粗暴使用新的set将两个set整合到一起的做法很耗内存,虽然省时间,find查找时间复杂度相对于暴力查找稍稍优越点,但不必开拓新的空间(难得时间换空间。。。)
#include
#include
#include
using namespace std;
int main(){
set<int>jihe[55];
//setchuli[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
#include
#include
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");
}
}
}