top1编程
← 返回题目
题解

【提高】比赛组队

1 条题解

  • 0
    @ 2026-7-29 0:18:18
    #include<bits/stdc++.h>
    using namespace std;
    int f[20001];
    int find(int x){
        if(f[x]!=x)f[x]=find(f[x]);
        return f[x];
    }
    int main(){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)f[i]=i;
        for(int i=0;i<k;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            int fa=find(a),fb=find(b);
            if(fa!=fb)f[fa]=fb;
        }
        int cnt[20001]={0};
        for(int i=1;i<=n;i++)cnt[find(i)]++;
        int dp[20001]={0};
        dp[0]=1;
        for(int i=1;i<=n;i++)
            if(cnt[i])
                for(int j=20000;j>=cnt[i];j--)
                    if(dp[j-cnt[i]])dp[j]=1;
        int ans=0,minv=20001;
        for(int i=0;i<=20000;i++)
            if(dp[i]){
                int diff=abs(i-m);
                if(diff<minv||(diff==minv&&i<ans)){
                    minv=diff;
                    ans=i;
                }
            }
        printf("%d",ans);
        return 0;
    }
    
    • 1