题解:P12245 共同兴趣
LotleTos
·
·
题解
提前处理出他原来跟每个人的共同兴趣数,以及每个人的共同兴趣数要求。
每个人的共同兴趣数要求就是他目前跟别人的最大的共同兴趣数,只要共同兴趣数达到了这个要求,那么就会发邀请。三重循环计算这个。
然后直接枚举那个增加的兴趣,里面套循环计算添加这个兴趣之后给他发邀请的人数,取最大值。
## code
```cpp
#include<bits/stdc++.h>
using namespace std;
int a[510][510];
int b[510];
int f[510];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<n;i++){
int sum=0;
for(int j=0;j<m;j++){
if(a[0][j]==1&&a[i][j]==1){
sum++;
}
}
b[i]=sum;
}
for(int i=1;i<n;i++){
int mix=0;
for(int j=1;j<n;j++){
if(j==i){
continue;
}
int sum=0;
for(int k=0;k<m;k++){
if(a[i][k]==1&&a[j][k]==1){
sum++;
}
}
if(sum>mix){
mix=sum;
}
}
f[i]=mix;
}
int ans=0;
for(int i=1;i<n;i++){
if(b[i]>=f[i]){
ans++;
}
}
for(int k=0;k<m;k++){
if(a[0][k]==1){
continue;
}
int cnt=0;
for(int i=1;i<n;i++){
int x=b[i]+(a[i][k]==1?1:0);
if(x>=f[i]){
cnt++;
}
}
if(cnt>ans){
ans=cnt;
}
}
cout<<ans;
}
```