Given two sets of integers, the similarity of the sets is defined to be N~c~/N~t~*100%, where N~c~ is the number of distinct common numbers shared by the two sets, and N~t~ is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.
Input Specification:
Each input file contains one test case. Each case first gives a positive integer N (<=50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (<=10^4^) and followed by M integers in the range [0, 10^9^]. After the input of sets, a positive integer K (<=2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.
Output Specification:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.
Sample Input:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
Sample Output:
50.0% 33.3%
这种方法有一个测试点不能通过,原因是建立map的开销比较大,并且再查询的时候,会反复的建立map,是一个很耗费时间的过程,应该在输出数据的时候就为每一组数据建立map,这样能避免之后重复建立map;
在编程中应该避免重复没有必要的操作
1 #include<iostream> 2 #include<vector> 3 #include<map> 4 #include<set> 5 using namespace std; 6 int main(){ 7 int n, m, i, j; 8 vector<int> v[51]; 9 cin>>n; 10 for(i=0; i<n; i++){ 11 cin>>m; 12 for( j=0; j<m; j++){ 13 int temp; 14 scanf("%d", &temp); 15 v[i].push_back(temp); 16 } 17 } 18 cin>>m; 19 for(i=0; i<m; i++){ 20 int a, b, cnt=0, sum=0; 21 cin>>a>>b; 22 map<int, int> mmap; 23 for(j=0; j<v[a-1].size(); j++) 24 if(mmap.count(v[a-1][j])==0) mmap[v[a-1][j]] = 1; 25 for(j=0; j<v[b-1].size(); j++){ 26 if(mmap.count(v[b-1][j])==0) mmap[v[b-1][j]] = 2; 27 else if(mmap[v[b-1][j]]==1){ 28 cnt++; 29 mmap[v[b-1][j]]=2; 30 } 31 } 32 printf("%.1f%% ", cnt*100.0/mmap.size()); 33 } 34 return 0; 35 }
修改:在输入数据的时候,就组织数据, 并用更简洁的set来建立数据结构
1 #include<iostream> 2 #include<set> 3 #include<vector> 4 using namespace std; 5 int main(){ 6 int n, m, i,j; 7 cin>>n; 8 vector<set<int>> v; 9 for(i=0; i<n; i++){ 10 set<int> s; 11 cin>>m; 12 int temp; 13 for(j=0; j<m; j++){ 14 cin>>temp; 15 s.insert(temp); 16 } 17 v.push_back(s); 18 } 19 cin>>m; 20 for(i=0; i<m; i++){ 21 int a, b; 22 cin>>a>>b; 23 int nc=v[a-1].size(), nt=0; 24 for(auto it=v[b-1].begin(); it!=v[b-1].end(); it++){ 25 if(v[a-1].count(*it)!=0) nt++; 26 else nc++; 27 } 28 printf("%.1f%% ", 100.0*nt/nc); 29 } 30 return 0; 31 }