PAT:1063. Set Similarity (25) AC

#include<stdio.h>
#include<set>
using namespace std;

set<int> str[51];      //最大51个集合 

void compare(int s1,int s2)
{
  int different=str[s1].size(),same=0;    //初始化并集元素为s1元素个数,交集元素0个  
  for(set<int>::iterator it=str[s2].begin() ; it!=str[s2].end() ; ++it )  //【skill】迭代器it指向s2开始处,加到结尾处结束
    if(str[s1].find(*it)!=str[s1].end())  //【skill】迭代器it指向位置的内容在s1中的坐标
      ++same;                //【skill】不是结尾,就表明找到(此处结尾是不可达的,end是s1最后一个元素的下一个位置)
    else
      ++different;            //是s1结尾,表明找不到,这个元素不同
  printf("%.1f%%
",(double)same/(double)different*100);
}

int main()
{
  int n;          //n个集合
  scanf("%d",&n);
  for(int i=1 ; i<=n ; ++i)
  {
    int k=0;
    scanf("%d",&k);
    for(int j=0 ; j<k ; ++j)
    {
      int tmp;
      scanf("%d",&tmp);
      str[i].insert(tmp);
    }
  }
  int q;
  scanf("%d",&q);
  for(int i=0 ; i<q ; ++i)
  {
    int s1,s2;
    scanf("%d%d",&s1,&s2);
    compare(s1,s2);
  }
  return 0;
}
原文地址:https://www.cnblogs.com/Evence/p/4319044.html