L2-028 秀恩爱分得快 (25 分)
首先写了个较为暴力的代码。
const int N=1010;
bool sex[N];
double sum[N][N];
int n,m;
void print(int a,int b)
{
if(!sex[a]) cout<<'-';
cout<<a<<' ';
if(!sex[b]) cout<<'-';
cout<<b<<endl;
}
int main()
{
cin>>n>>m;
while(m--)
{
int k;
cin>>k;
vector<int> a(k);
for(int i=0;i<k;i++)
{
string s;
cin>>s;
a[i]=stoi(s);
a[i]=abs(a[i]);
if(s[0] == '-') sex[a[i]]=false;
else sex[a[i]]=true;
}
for(int i=0;i<k;i++)
for(int j=i+1;j<k;j++)
{
sum[a[i]][a[j]]+=1.0/k;
sum[a[j]][a[i]]+=1.0/k;
}
}
int a,b;
cin>>a>>b;
a=abs(a),b=abs(b);
double maxa=0,maxb=0;
for(int i=0;i<n;i++)
{
maxa=max(maxa,sum[a][i]);
maxb=max(maxb,sum[b][i]);
}
if(maxa == sum[a][b] && maxb == sum[b][a])
print(a,b);
else
{
for(int i=0;i<n;i++)
if(sum[a][i] == maxa && sex[a] != sex[i])
print(a,i);
for(int i=0;i<n;i++)
if(sum[b][i] == maxb && sex[b] != sex[i])
print(b,i);
}
//system("pause");
return 0;
}
可以发现复杂度的量级为:\(O(MK^2)\),其中\(M\)的量级为\(1000\),\(k\)的量级为$500%,显然时间上不能完全通过此题。
考虑优化:
由于只会询问异性之间的亲密度,所以我们只需累加异性之间的亲密度,而上述代码即累加了异性又累加了同性。
const int N=1010;
bool sex[N];
double sum[N][N];
int n,m;
void print(int a,int b)
{
if(!sex[a]) cout<<'-';
cout<<a<<' ';
if(!sex[b]) cout<<'-';
cout<<b<<endl;
}
int main()
{
cin>>n>>m;
while(m--)
{
int k;
cin>>k;
vector<int> a(k);
vector<int> gender[2];
for(int i=0;i<k;i++)
{
string s;
cin>>s;
a[i]=stoi(s);
a[i]=abs(a[i]);
if(s[0] == '-')
{
sex[a[i]]=false;
gender[0].pb(a[i]);
}
else
{
sex[a[i]]=true;
gender[1].pb(a[i]);
}
}
for(int i=0;i<gender[0].size();i++)
for(int j=0;j<gender[1].size();j++)
{
int x=gender[0][i],y=gender[1][j];
sum[x][y]+=1.0/k;
sum[y][x]+=1.0/k;
}
}
int a,b;
cin>>a>>b;
a=abs(a),b=abs(b);
double maxa=0,maxb=0;
for(int i=0;i<n;i++)
{
maxa=max(maxa,sum[a][i]);
maxb=max(maxb,sum[b][i]);
}
if(maxa == sum[a][b] && maxb == sum[b][a])
print(a,b);
else
{
for(int i=0;i<n;i++)
if(sum[a][i] == maxa)
print(a,i);
for(int i=0;i<n;i++)
if(sum[b][i] == maxb)
print(b,i);
}
//system("pause");
return 0;
}