zoukankan      html  css  js  c++  java
  • 3372 选学霸

    3372 选学霸

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 大师 Master
     
     
     
    题目描述 Description

    老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议。所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议,又与原来的M尽可能接近。

    输入描述 Input Description

    第一行,三个正整数N,M,K。

    第2...K行,每行2个数,表示一对实力相当的人的编号(编号为1…N)。

    输出描述 Output Description

    一行,表示既不让同学们抗议,又与原来的M尽可能接近的选出学霸的数目。(如果有两种方案与M的差的绝对值相等,选较小的一种。)

    样例输入 Sample Input

    4 3 2

    1 2

    3 4

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    100%的数据N,P<=30000

    分类标签 Tags 点此展开 

     
     
    题解: 

    输入时,采用并查集,把实力相同的人合并到一个集合,在一个循环,统计每个集合的人数,就像是物品
    的体积,背包最多的体积不超过m,取与m之差的绝对值最小的那种方案(跑绝对值之差最小的01背包就行)。

    AC代码:
    #include<bits/stdc++.h>
    using namespace std;
    const int N=4e5+10;
    int n,m,k,cnt,fa[N],v[N],belong[N],f[N];
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    } 
    int main(){
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1,x,y;i<=k;i++) scanf("%d%d",&x,&y),fa[find(y)]=find(x);
        for(int i=1;i<=n;i++){
            int t=find(i);
            if(!belong[t])
                v[belong[t]=++cnt]=1;
            else
                v[belong[t]]++;
        }
        f[0]=1;
        for(int i=1;i<=cnt;i++){
            for(int j=n;j>=v[i];j--){
                if(f[j-v[i]]) f[j]=1;
            }
        }
        int minn=0x3f3f3f3f,ans;
        for(int i=0;i<=n;i++) if(f[i]&&abs(i-m)<minn) minn=abs(i-m),ans=i;
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    jQuery对DOM节点进行操作(插入节点之在元素内部插入)
    jQuery对DOM节点进行操作(创建节点)
    jQuery对元素值操作
    jQuery对元素内容操作-->对HTML内容的操作
    jQuery对元素内容操作-->对文本内容的操作
    jQuery对元素内容操作
    jQuery选择器-->注意事项
    jQuery选择器-->表单选择器
    cp 快捷命令:复制文件到多个目录
    Python-字符串
  • 原文地址:https://www.cnblogs.com/shenben/p/5778515.html
Copyright © 2011-2022 走看看