题解:P12245 共同兴趣

· · 题解

提前处理出他原来跟每个人的共同兴趣数,以及每个人的共同兴趣数要求。 每个人的共同兴趣数要求就是他目前跟别人的最大的共同兴趣数,只要共同兴趣数达到了这个要求,那么就会发邀请。三重循环计算这个。 然后直接枚举那个增加的兴趣,里面套循环计算添加这个兴趣之后给他发邀请的人数,取最大值。 ## 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; } ```