Nc用自己的做法也是正确的
问题只可能出在Nt;
暂时找不到为什么错,怀疑是inser方法的问题把
#include <cstdio>
#include <string>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
set<int>num[60];
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
int m;
scanf("%d",&m);
for(int j = 1;j<=m;j++)
{
int temp;
scanf("%d",&temp);
num[i].insert(temp);
}
}
int k;
scanf("%d",&k);
int Nc,Nt;
for(int i = 0;i<k;i++)
{
int k1,k2;
scanf("%d%d",&k1,&k2);
Nc=0;
Nt = num[k2].size();
set<int>::iterator ait = num[k2].begin();
for(set<int>::iterator it = num[k1].begin();it!=num[k1].end();it++)
{
if(num[k2].find(*it) != num[k2].end()) Nc++;
else Nt++;
}
Nc=0;
for(set<int>::iterator it = num[k1].begin();it!=num[k1].end();it++)
{
while(*it > * ait)
{
if(ait == num[k2].end())
{
break;
}
ait++;
}
if(*ait == *it)
{
Nc++;
ait++;
}
}
// for(set<int>::iterator it = num[k1].begin();it!=num[k1].end();it++)
// {
// num[k2].insert(*it);
// }
// Nt= num[k2].size();
printf("%.1f%%\n",Nc*100.0/Nt);
}
return 0;
}
学着算法笔记做的
#include <cstdio>
#include <string>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
set<int>num[60];
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
int m;
scanf("%d",&m);
for(int j = 1;j<=m;j++)
{
int temp;
scanf("%d",&temp);
num[i].insert(temp);
}
}
int k;
scanf("%d",&k);
int Nc,Nt;
for(int i = 0;i<k;i++)
{
int k1,k2;
scanf("%d%d",&k1,&k2);
Nc=0;
Nt = num[k2].size();
set<int>::iterator ait = num[k2].begin();
for(set<int>::iterator it = num[k1].begin();it!=num[k1].end();it++)
{
if(num[k2].find(*it) != num[k2].end()) Nc++;
else Nt++;
}
printf("%.1f%%\n",Nc*100.0/Nt);
}
return 0;
}
第一次做出来是0分,主要是总数的计算错误
实测Nc正确
#include <cstdio>
#include <string>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
set<int>num[60];
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
int m;
scanf("%d",&m);
for(int j = 1;j<=m;j++)
{
int temp;
scanf("%d",&temp);
num[i].insert(temp);
}
}
int k;
scanf("%d",&k);
double Nc=0,Nt;
for(int i = 0;i<k;i++)
{
Nc=0;
int k1,k2;
scanf("%d%d",&k1,&k2);
set<int>::iterator ait = num[k2].begin();
for(set<int>::iterator it = num[k1].begin();it!=num[k1].end();it++)
{
while(*it > * ait)
{
if(ait == num[k2].end())
{
break;
}
ait++;
}
if(*ait == *it)
{
Nc++;
ait++;
}
}
====================Nt计算是错的
for(set<int>::iterator it = num[k1].begin();it!=num[k1].end();it++)
{
num[k2].insert(*it);//可能insert方法里面有循环导致时间度太复杂
}
====================Nt计算是错的
Nt = num[k2].size();
double ans = Nc/Nt * 100;
printf("%.1f%\n",ans);
}
return 0;
}