-
J - Architect of Your Own Fortune
- Gym - 101243J
- 注意键图方式进行二分图匹配。
-
#include<bits/stdc++.h> using namespace std; #define maxn 550 int a[maxn],b[maxn],mmp[maxn][maxn],first[maxn],n,m; bool vis[maxn]; bool deal(int x) { for(int j=0; j<m; j++) { if(mmp[x][j]!=0&&vis[j]==0) { vis[j]=1; if(first[j]==-1||deal(first[j])) { first[j]=x; return 1; } } } return 0; } int main() { int one,two,ans=0; cin>>n>>m; memset(mmp,0,sizeof(mmp)); memset(first,-1,sizeof(first)); for(int i=0; i<n; i++) { cin>>a[i]; } for(int i=0; i<m; i++) cin>>b[i]; for(int i=0; i<n; i++) { one=a[i]/100000+a[i]/10000%10+a[i]/1000%10; for(int j=0; j<m; j++) { two=b[j]%10+b[j]/10%10+b[j]/100%10; if(one==two) mmp[i][j]=1; } } for(int i=0; i<m; i++) { one=b[i]/100000+b[i]/10000%10+b[i]/1000%10; for(int j=0; j<n; j++) { two=a[j]%10+a[j]/10%10+a[j]/100%10; if(one==two) mmp[j][i]=2; } } for(int i=0; i<n; i++) { memset(vis,0,sizeof(vis)); if(deal(i)) ans++; } cout<<ans<<endl; for(int i=0; i<m; i++) if(first[i]!=-1) { if(mmp[first[i]][i]==1) cout<<"AT "<<a[first[i]]<<" "<<b[i]<<endl; else cout<<"TA "<<b[i]<<" "<<a[first[i]]<<endl; } return 0; }
J - Architect of Your Own Fortune -hah-first blood -二分图.
最新推荐文章于 2023-03-17 12:40:56 发布