CODEVS【3372】选学霸
老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议。所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议,又与原来的M尽可能接近。
第一行,三个正整数N,M,K。
第2...K行,每行2个数,表示一对实力相当的人的编号(编号为1…N)。
一行,表示既不让同学们抗议,又与原来的M尽可能接近的选出学霸的数目。(如果有两种方案与M的差的绝对值相等,选较小的一种。)
4 3 2
1 2
3 4
2
100%的数据N,P<=30000
实力相当的人要尽量选上,因此我们可以利用并查集把实力相当的人合并,每个集中的老大都有自己的盟友(实力相当的人)(第i个人盟友个数用w[i]表示,初始化w[i]=1),当合并两个集时(f[a]=b),要注意把a的盟友同时合并给b,即w[b]+=w[a],a的盟友自然成了b的盟友,a现在只是一个小喽罗,所以w[a]=0;现在开始枚举w[i]不为0的人,则可以把一个个集看作一个个团队(也可以是单人团队),w[i]表示团队人的个数,++k,最终k表示团队的个数。问题转化为了01背包问题。但是注意此问题要求的是差的绝对值最小的值,所以可以从0开始向两边枚举(枚举dp[m-i]是否等于m-i,dp[m+i]是否等于m+i),第一个枚举到的值输出即可。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<stack>
#define maxn 30000+50
#define inf 0x7fffffff
#define xiao 1e-9
using namespace std;
int f[maxn],w[maxn],a[maxn],dp[*maxn];
int find(int x)
{
if(f[x]==x) return x;
else return find(f[x]);
}
int main()
{
int n,m,k,b,x;
cin>>n>>m>>k;
for(int i=;i<=n;++i){f[i]=i;w[i]=;}
for(int i=;i<=k;++i)
{
scanf("%d%d",&x,&b);
int fa=find(x),fb=find(b);
if(fa!=fb)
{
f[x]=b;
w[b]+=w[x];
w[x]=;
}
}
k=;
for(int i=;i<=n;++i)
{
if(w[i]!=) a[++k]=w[i];
}
for(int i=;i<=k;++i)
{
for(int j=*m+;j>=a[i];--j)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
for(int i=;i<=m;++i)
{
if(dp[m-i]==m-i){cout<<m-i;break;}
if(dp[m+i]==m+i) {cout<<m+i;break;}
}
return ;
}
选学霸
CODEVS【3372】选学霸的更多相关文章
- codevs 3372 选学霸
3372 选学霸 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果 ...
- codevs——3372 选学霸(背包)
题目等级 : 大师 Master 时间限制: 1 s 空间限制: 128000 KB 题解 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实 ...
- codevs 3372 选学霸(hash+并查集+多重背包)
先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...
- codevs3370 选学霸(背包dp,并查集)
3372 选学霸 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相 ...
- 选学霸(codevs 3372)
题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- 「LuoguP2170」 选学霸(01背包
Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议, ...
- Luogu P2170选学霸【并查集+背包】By cellur925
题目传送门 开始看到本题完全认为就是个彻头彻尾的并查集,只要把实力相当的人都并到一个集合中,最后再找一共有多少联通块即可. 后来发现这是大错特错的qwq.因为选了一个集合中的某人,那这个集合中所有人就 ...
- 『题解』洛谷P2170 选学霸
更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...
随机推荐
- C程序设计语言 -- 运算符优先级
1. 运算符分类 算术运算符 [+, -,*, /, % , ++, --] 关系运算符 [>, >=, <, <=] 相等性运 ...
- SpringSecurity项目报错
启动时,提示: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory be ...
- Net core 轮子
.net core 使用的人渐渐多了起来,轮子也渐渐多了起来,为了避免重复造轮子,以下列举了一些造好的轮子 1. IP 请求频率限制 git: https://github.com/stefanpro ...
- Python基础:输入与输出(I/O)
来做一个NLP任务 步骤为: 1.读取文件: 2.去除所有标点符号和换行符,并把所有大写变成小写: 3.合并相同的词,统计每个词出现的频率,并按照词频从大到小排序: 4.将结果按行输出到文件 out. ...
- Linux 面试的一些基础命令
1.查询服务器负载 (1)uptime [root@oldboy ~]# uptime 20:17:18 up 7:41, 2 users, load average: 0.00, 0.00, 0.0 ...
- 牛课第二次多校I
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 题目描述 White Cloud has a square of n*n from (1,1) ...
- Kubernetes添加带Quota限额的CephFS StorageClass
1. 在Ceph上为Kubernetes创建一个文件系统 # ceph osd pool create cephfs_data # ceph osd pool create cephfs_metada ...
- MySQL之架构与历史(二)
多版本并发控制 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁.基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC).不仅是MySQL,包括Oracle.PostgreSQ ...
- TCP/IP网络编程之域名及网络地址
域名系统 DNS是对IP地址和域名进行互相转换的系统,其核心是DNS服务器.提供网络服务的服务端也是通过IP地址来区分的,但由于IP地址难于记忆,因此通过容易记忆并表述的域名来取代IP地址 在浏览器地 ...
- Jetty,Tomcat对MIME协议的配置参数说明
此处做一下小的汇总,针对Jetty容器内,存在excel的xlsx文件直接通过链接的方式下载的时候,如果是在Chrome浏览器时,则直接触发浏览器的下载行为,但是在IE11的浏览器上,则浏览器会直 ...