标签:system 不同 size max name src code 数据 class
超时主要是这个语句的原因:
for(iter = temp[num1].begin();iter != temp[num1].end();++iter){ for(iter1 = temp[num2].begin();iter1 != temp[num2].end();++iter1){ if(*iter == *iter1){ t1.insert(*iter); } } }
这个语句可以这样优化:
int totalNum = st[y].size(),sameNum = 0;//不同数的个数,相同数的个数 //遍历集合st[x] for(set<int>::iterator it = st[x].begin();it != st[x].end();++it){ if(st[y].find(*it) != st[y].end()){//这条语句很厉害! sameNum++; }else{ totalNum++; } }
#include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int maxn = 40010;//最大学生人数 int main(){ int n; scanf("%d",&n); set<int> temp[n+1]; for(int i = 1;i<n+1;++i){ int number; scanf("%d",&number); for(int j = 0;j<number;++j){ int num; scanf("%d",&num); temp[i].insert(num); } } int k; scanf("%d",&k); double result[k]; //scanf("%d",&k); int num1,num2; for(int i=0;i<k;++i){ set<int> t1;//交集 set<int> t2;//并集 scanf("%d%d",&num1,&num2); set<int>::iterator iter; set<int>::iterator iter1; for(iter = temp[num1].begin();iter != temp[num1].end();++iter){ for(iter1 = temp[num2].begin();iter1 != temp[num2].end();++iter1){ if(*iter == *iter1){ t1.insert(*iter); } } } for(iter = temp[num1].begin();iter!=temp[num1].end();++iter){ t2.insert(*iter); } for(iter1 = temp[num2].begin();iter1!=temp[num2].end();++iter1){ t2.insert(*iter1); } result[i] = t1.size() * 100.0 / t2.size(); } for(int i = 0;i<k;++i){ printf("%.1f%%\n",result[i]); //printf("%\n"); } system("pause"); return 0; }
优化后:
#include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int maxn = 40010;//最大学生人数 const int N = 51; set<int> st[N];//N个集合 void compare(int x,int y){ int totalNum = st[y].size(),sameNum = 0;//不同数的个数,相同数的个数 //遍历集合st[x] for(set<int>::iterator it = st[x].begin();it != st[x].end();++it){ if(st[y].find(*it) != st[y].end()){//这条语句很厉害! sameNum++; }else{ totalNum++; } } printf("%.1f%%\n",sameNum * 100.0 / totalNum); } int main(){ int n,k,q,v,st1,st2; scanf("%d",&n); for(int i = 1;i<=n;++i){ scanf("%d",&k); for(int j=0;j<k;++j){ scanf("%d",&v);//集合i中的元素v st[i].insert(v);//将元素v加入集合st[i]中 } } scanf("%d",&q);//q个查询 for(int i = 0;i<q;++i){ scanf("%d%d",&st1,&st2);//欲对比的集合编号 compare(st1,st2); } system("pause"); return 0; }
C++ STL set A1063.Set Similarity (注意查询的优化:set数据结构的 find() 语句 最强大)
标签:system 不同 size max name src code 数据 class
原文地址:https://www.cnblogs.com/JasonPeng1/p/12200669.html