最近都是最后一个case超时啊,一开始的思路是设set数组存数据,C=A|B,|A|+|B|-|C|/|C|
,然后改成只遍历其中一个+find的方法,统计出相同的个数和总个数
第一次提交
#include<stdio.h>
#include<set>
using namespace std;
set<int> s[55];
int main()
{
int n,m,t,num,a,b;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%d",&t);
s[i+1].insert(t);
}
}
scanf("%d",&num);
for(int i=0;i<num;i++)
{
scanf("%d%d",&a,&b);
set<int>total;
for(set<int>::iterator it=s[a].begin();it!=s[a].end();it++)
total.insert(*it);
for(set<int>::iterator it=s[b].begin();it!=s[b].end();it++)
total.insert(*it);
int nc=s[a].size()+s[b].size()-total.size();
printf("%.1f",double(nc)/total.size()*100);
printf("%%\n");
}
return 0;
}
AC代码
#include<stdio.h>
#include<set>
#include<vector>
using namespace std;
set<int> s[55];
int main()
{
int n,m,t,num,a,b;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%d",&t);
s[i+1].insert(t);
}
}
scanf("%d",&num);
for(int i=0;i<num;i++)
{
scanf("%d%d",&a,&b);
set<int>total;
int totalnum = s[a].size(), samenum = 0;
for (set<int>::iterator it = s[b].begin(); it != s[b].end(); it++)
{
if (s[a].find(*it) != s[a].end())
samenum++;
else
totalnum++;
}
printf("%.1lf%%\n", samenum*100.0/totalnum);
}
return 0;
}
网友评论