这一道题,由于他说,“如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议。”而要求“既不让同学们抗议,又与原来的M尽可能接近”。因此,我们要对实力相当的一组同学必须全部选择。所以,我们需要先使用一个并查集,对这个无向图进行“缩点”,存下每一组学霸的人的数量。

我们在并查集的Union操作中,可以顺带就把每一组的学霸也Union过去,具体实现看代码。

然后,我们得到一些组的学霸。然后,我们把它转化成一个装箱问题。如果有可以刚好选满的,我们就把他和Min比较,如果比Min小,我们就记录下来。至于题目要求的“。(如果有两种方案与M的差的绝对值相等,选较小的一种:)”,其实可以很自然地。因为两次相等的话,前面就已经标记过了,不会在执行后面的了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define rep(i,a,n) for(register int i=(a);i<=(n);++i)
#define per(i,a,n) for(register int i=(a);i>=(n);--i)
#define fec(i,x) for(register int i=head[x];i;i=Next[i])
#define debug(x) printf("debug:%s=%d\n",#x,x)
#define mem(a,x) memset(a,x,sizeof(a))
template<typename A>inline void read(A&a){a=0;int f=1,c=0;while(c<'0'||c>'9'){c=getchar();if(c=='-')f*=-1;}while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}a*=f;}
template<typename A,typename B>inline void read(A&a,B&b){read(a);read(b);}
template<typename A,typename B,typename C>inline void read(A&a,B&b,C&c){read(a);read(b);read(c);}
template<typename A>A gcd(const A&m,const A&n){return m%n==0?n:gcd(n,m%n);} const int maxn=20000+7,INF=0x7fffffff;
int n,m,k;
int x,y,ans=INF,Min=INF;
int father[maxn];
int f[maxn];
int cnt[maxn],tot;
int num[maxn]; int find(int x){
return father[x]==x?x:father[x]=find(father[x]);
} inline void unionn(int x,int y){
int xx=find(x),yy=find(y);
if(xx==yy)return;//这一句话非常重要!如果没有这句话,若xx==yy,cnt[xx]就会被重复计算以后被清零!
father[yy]=xx;
cnt[xx]+=cnt[yy];
cnt[yy]=0;
} inline void UFS_init(){
rep(i,1,n)father[i]=i,cnt[i]=1;
} void CC(){
rep(i,1,n)if(cnt[i])num[++tot]=cnt[i];
} void dp(){
rep(i,1,tot)
per(j,n,num[i])
f[j]=max(f[j],f[j-num[i]]+num[i]);
} void Init(){
read(n,m,k);
UFS_init();
rep(i,1,k){
read(x,y);
unionn(x,y);
}
} void Work(){
CC();
dp();
rep(i,0,n)if(f[i]==i&&abs(f[i]-m)<Min)Min=abs(f[i]-m),ans=f[i];//注意从零开始循环,0也是一个正解!
printf("%d\n",ans);
} int main(){
Init();
Work();
return 0;
}

[Luogu2170]选学霸的更多相关文章

  1. codevs 3372 选学霸

    3372 选学霸  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果 ...

  2. CODEVS【3372】选学霸

    题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...

  3. codevs3370 选学霸(背包dp,并查集)

    3372 选学霸  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相 ...

  4. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  5. codevs——3372 选学霸(背包)

    题目等级 : 大师 Master  时间限制: 1 s  空间限制: 128000 KB 题解       题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实 ...

  6. 「LuoguP2170」 选学霸(01背包

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

  7. Luogu P2170选学霸【并查集+背包】By cellur925

    题目传送门 开始看到本题完全认为就是个彻头彻尾的并查集,只要把实力相当的人都并到一个集合中,最后再找一共有多少联通块即可. 后来发现这是大错特错的qwq.因为选了一个集合中的某人,那这个集合中所有人就 ...

  8. 选学霸(codevs 3372)

    题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...

  9. 『题解』洛谷P2170 选学霸

    更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...

随机推荐

  1. 向量积&&凸包算法

    参考:Thanks 百度百科 http://blog.csdn.net/keng_s/article/details/52131034 https://www.cnblogs.com/aiguona/ ...

  2. Python_002(基础知识)

    1.格式化输出 %s:字符串的占位符,可以放置任何内容(数字) 代码展示:%去除法 admin_input1 = input("请输入用户名:") pass_input = inp ...

  3. ps磨皮的方法

    磨皮顾名思义就是将皮肤模糊掉,它可以去除皮肤上的一些斑点以及细纹,从而使皮肤看起来更加光滑.下面就是两张磨皮前后的对比图,很明显右边的人物的皮肤看起来要更好一些:给人的视觉效果也更年轻一点. 磨皮前后 ...

  4. Log4j appender、layout

    appender输出类型配置 layout日志信息格式 Threshold属性指定输出等级 Append属性指定是否追加内容 (1)appender输出类型配置 Log4j官方的appender给出了 ...

  5. 【CDN+】 CDN项目的两大核心--缓存与回源

    前言 项目中碰到CDN专用名词: 回源, 然后不知道什么意思,反过来查询了一下CDN相关的一些基本术语,特做记录 CDN基础概念 CDN (Content Delivery Network,即内容分发 ...

  6. jmeter之ServerAgent监控资源

    对linux服务器的服务进行压测时,服务器的运行情况可以通过添加插件来观察,而不用使用top命令实时的去看 1.资源准备 2.环境准备 3.资源监控 1.资源准备 可通过该网址下载jmeter所有插件 ...

  7. 为什么有mac地址还学要有IP地址??

    历史原因:早期的以太网只有集线器 ,没有交换机,所以发出去的包能被以太网内的所有机器监听到,因此要附带上MAC地址,每个机器只需要接受与自己MAC地址相匹配的包. 个人感觉上面的说法并不是太准确.找明 ...

  8. 企业SRC整理

    0.SRCs|安全应急响应中心 - 0xsafe 1.腾讯安全应急响应中心(TSRC) 2.360安全应急响应中心 3.京东安全应急响应中心(JSRC) 4.平安集团安全应急响应中心(PSRC) 5. ...

  9. JSP基础--九大内置对象

    JSP九大内置对象 Object findAttribute(String name):依次在page.request.session.application范围查找名称为name的数据,如果找到就停 ...

  10. python学习第十四天字典的del(),pop().popitem(),clear()删除方法

    字典的每个键值 key=>value 数据类型,字典的key是唯一的,Value可以一样 names={'玖乐公司网址':‘www.96net.com.cn’,"电池网":' ...