TOJ3955: NKU ACM足球赛(并查集+map+细节题)
时间限制(普通/Java):5000MS/15000MS 内存限制:65536KByte
描述
NKU ACM最近要举行足球赛,作为此次赛事的负责人,Lee要对报名人员进行分队。分队要遵循如下原则:
一个人不能加入多支队伍;
不认识的人不能分在同一队;
如果a和b认识,b和c认识,那么认为a和c也认识;
每支队伍上限8人,下限5人;
尽量使队伍满员。
由于参赛人数很多,Lee表示无能为力,所以请你帮助Lee编程解决比赛有多少队伍。
输入
第一行输入两个整数,n和m,n(1<=n<=300000)代表报名人数,m(1<=m<=500000)代表关系数。接下来m行每行两个整数a(1<=a<=n)和b(1<=b<=n)表示a和b认识。
输出
输出一行,包含一个整数,表示队伍数量。
样例输入
11 10
1 2
2 3
2 6
3 4
4 5
5 6
7 9
9 11
11 8
8 10
样例输出
2
思路:一看到“如果a和b认识,b和c认识,那么认为a和c也认识”这句话,马上想到并查集或者floyd算法。考虑到n非常大,直接拿并查集维护关系。
然后看到有几只队伍,那么就看每个小团队有多少人了,具体的可以拿stl里面的map。搞一下ma[fid(i)]++; 代表这个小团队里面的人多一个。
之后就是细节了“每支队伍上限8人,下限5人;尽量满员”,这句话如果考虑清楚,就不会wa了,具体看代码。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<vector>
#include<map>
#define LL long long
using namespace std;
int pre[],n;
int fid(int x){return pre[x] == x ? x : pre[x] = fid(pre[x]) ;}
void join(int x,int y){fid(x)!=fid(y)?pre[fid(x)]=fid(y):;}
void init(){for(int i = ;i <= n ; i++)pre[i] = i;}
map<int,int>ma;
int main()
{
int m;
scanf("%d %d",&n,&m);
init();
while(m--){
int x,y;
scanf("%d %d",&x,&y);
join(x,y);
}
int ans = ;
for(int i = ; i <= n ; i++) ma[fid(i)]++;//每个小团体的人数存在map中
map<int,int>::iterator it = ma.begin();
for(;it != ma.end();it++){
int t = it->second;
for(int i = ; i >= ; i--){
if(t >= i){
ans += t/i; t %= i;
}
}//尽量满员
}
printf("%d\n",ans);
}
TOJ3955: NKU ACM足球赛(并查集+map+细节题)的更多相关文章
- ACM数据结构-并查集
ACM数据结构-并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...
- HDU 2419 Boring Game(并查集+map)
感觉做得有点复杂了,但是AC了还是...爽... 题意:给你n个点每个点有一个价值,接下来有m条边,然后是q个操作,每个操作有三种情况: F X K:寻找与X点直接或间接相连的不小于价值K的最小价值, ...
- poj 2236:Wireless Network(并查集,提高题)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 16065 Accepted: 677 ...
- poj 2524:Ubiquitous Religions(并查集,入门题)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23997 Accepted: ...
- poj 1611:The Suspects(并查集,经典题)
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 21472 Accepted: 10393 De ...
- hrbustoj 1073:病毒(并查集,入门题)
病毒Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 719(185 users) Total Accepted: 247(163 user ...
- [Swust OJ 772]--Friend(并查集+map的运用)
题目链接:http://acm.swust.edu.cn/problem/772/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- acm专题--并查集
题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...
- Atcoder 2159 連結 / Connectivity(并查集+map乱搞)
問題文N 個の都市があり.K 本の道路と L 本の鉄道が都市の間に伸びています. i 番目の道路は pi 番目と qi 番目の都市を双方向に結び. i 番目の鉄道は ri 番目と si 番目の都市を双 ...
随机推荐
- MBR (主引导记录)
概念 主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码.它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别.分区引导信息的定位,它由磁盘操 ...
- js弹出div层,弹出层页面底部出现UL出现一条线问题
整个弹出div层,列表满一页时:底部会出现一条横线 原因:ul固定写在页面中了 解决方法: 将ul代码与li列表一样写在js中,如下 var newhtml = '<ul class=" ...
- AJax知识介绍
参考:http://www.runoob.com/ajax/ajax-asp-php.html
- python oracle 查询返回字典
from: https://sourceforge.net/p/cx-oracle/mailman/message/27145597/ I'd do it with a "row facto ...
- es6 初级之---const 和 默认参数
1. const 的定义: 1.1 常量定义的时候要赋值,不赋值是会报错的: <!DOCTYPE html> <html lang="en"> <he ...
- Seaweed-FS综合使用测试(转)
2016-03-16 12:17:48 Seaweed-FS综合使用测试 参考信息 https://github.com/chrislusf/seaweedfs/ https://bintray. ...
- OGNL表达式(转载)
OGNL表达式(转载) 1.什么是OGNL OGNL:Object Graphic Navigation Language(对象图导航语言) 它是Struts2中默认的表达式语言.使用表达式需要借 ...
- vue项目分辨率
vue项目分辨率写在这里:
- springboot 整合redis redis工具类
一步 : pom中引入相关依赖 <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boo ...
- Kubernetes 本地仓库
1.Kubernetes本地私有仓库 Docker仓库主要用于存放Docker镜像,Docker仓库分为公共仓库和私有仓库,基于registry可以搭建本地私有仓库.使用私有仓库有如下优点: 1)节省 ...