[Luogu2170]选学霸
这一道题,由于他说,“如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议。”而要求“既不让同学们抗议,又与原来的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]选学霸的更多相关文章
- codevs 3372 选学霸
3372 选学霸 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果 ...
- CODEVS【3372】选学霸
题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...
- codevs3370 选学霸(背包dp,并查集)
3372 选学霸 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相 ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- codevs——3372 选学霸(背包)
题目等级 : 大师 Master 时间限制: 1 s 空间限制: 128000 KB 题解 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实 ...
- 「LuoguP2170」 选学霸(01背包
Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议, ...
- Luogu P2170选学霸【并查集+背包】By cellur925
题目传送门 开始看到本题完全认为就是个彻头彻尾的并查集,只要把实力相当的人都并到一个集合中,最后再找一共有多少联通块即可. 后来发现这是大错特错的qwq.因为选了一个集合中的某人,那这个集合中所有人就 ...
- 选学霸(codevs 3372)
题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...
- 『题解』洛谷P2170 选学霸
更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...
随机推荐
- CSS中浮动属性float及清除浮动
1.float属性 CSS 的 Float(浮动),会使元素向左或向右移动,由于浮动的元素会脱离文档流,所以它后面的元素会重新排列. 浮动元素之后的那些元素将会围绕它,而浮动元素之前的元素将不会受到影 ...
- div拖拽的问题
今天看到一篇写的很好的文章,摘抄如下: 思路 父盒子相对定位,子元素,也就是被拖拽的元素绝对定位 当鼠标在子元素中按下时,绑定鼠标移动事件,根据鼠标位置改变元素位置 设置鼠标当前位置(offsetX, ...
- pycharm默认的模板修改python script
#!/usr/bin/env python # encoding: utf-8 #set( $SITE = "https://www.cnblogs.com/c-x-a" ) &q ...
- Sending form data
https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data This arti ...
- ubuntu 16.4下hadoop配置伪分布式时出现的坑
在ubuntu16.4下spark的单机/伪分布式配置我在此就不在一一赘述,详情请点击如下连接: Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04 我出现问题是 ...
- Gym 100917F Find the Length
题目链接:http://codeforces.com/gym/100917/problem/F ---------------------------------------------------- ...
- ajax跨域处理 No 'Access-Control-Allow-Origin' header is present on the requested resource 问题
Controller层的类上增加@CrossOrign注解,当前文件的所有接口就都可以被调用 spring注解@CrossOrigin不起作用的原因 1.是springMVC的版本要在4.2或以上版本 ...
- ES6中set的用法回顾
ES6中的set类似一个数组,但是其中的值都是唯一的,Set本身是一个构造函数,用来生成 Set 数据结构. set函数可以接受一个数组作为参数,用来初始化: const set = new Set( ...
- 【FICO系列】SAP FICO模块-完工入库后的差异凭证处理
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO模块-完工入库后 ...
- upc组队赛17 Greatest Common Divisor【gcd+最小质因数】
Greatest Common Divisor 题目链接 题目描述 There is an array of length n, containing only positive numbers. N ...