时间限制(普通/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+细节题)的更多相关文章

  1. ACM数据结构-并查集

    ACM数据结构-并查集   并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...

  2. HDU 2419 Boring Game(并查集+map)

    感觉做得有点复杂了,但是AC了还是...爽... 题意:给你n个点每个点有一个价值,接下来有m条边,然后是q个操作,每个操作有三种情况: F X K:寻找与X点直接或间接相连的不小于价值K的最小价值, ...

  3. poj 2236:Wireless Network(并查集,提高题)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16065   Accepted: 677 ...

  4. poj 2524:Ubiquitous Religions(并查集,入门题)

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted:  ...

  5. poj 1611:The Suspects(并查集,经典题)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21472   Accepted: 10393 De ...

  6. hrbustoj 1073:病毒(并查集,入门题)

    病毒Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 719(185 users) Total Accepted: 247(163 user ...

  7. [Swust OJ 772]--Friend(并查集+map的运用)

    题目链接:http://acm.swust.edu.cn/problem/772/ Time limit(ms): 1000 Memory limit(kb): 65535    Descriptio ...

  8. acm专题--并查集

    题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...

  9. Atcoder 2159 連結 / Connectivity(并查集+map乱搞)

    問題文N 個の都市があり.K 本の道路と L 本の鉄道が都市の間に伸びています. i 番目の道路は pi 番目と qi 番目の都市を双方向に結び. i 番目の鉄道は ri 番目と si 番目の都市を双 ...

随机推荐

  1. jqGrid 获取多级标题表头

    1.jgGrid没有提供此方法获取如下标题 2.实现代码 getHeaders:function(){ var headers=[],temptrs=[]; //select the group he ...

  2. 【ASP.NET 问题】IIS发布网站后出现“检测到在集成的托管管道模式下不适用的ASP.NET设置”的解决办法

    系统环境:win7 asp.net4.0网站挂到本地IIS上报错: google一下,发现N页解决方案,但是点进去一看前篇一律的解决方法是.将IIS7 下网站托管管道由继承模式修改为经典模式,这其实是 ...

  3. linux驱动开发第一步hello

    先查看Ubuntu的版本 cat /etc/issue lin@lin-virtual-machine:~$ cat /etc/issue Ubuntu 12.04 LTS \n \l 或者使用 li ...

  4. 解析main函数的命令行参数

    原创文章,转载请正确注明本文原始URL及作者. 介绍 写C/C++程序,我们常常需要把main函数的参数作为选项来传递.在linux中,解析选项有专门的函数可以用. int getopt(int ar ...

  5. NSNotification相关

    NSNotification处理过程是一个同步的过程.它的消息回调函数执行的线程跟发送消息代码(也就是postNotification)所在的线程相同,一个Notification发出后,在回调函数执 ...

  6. angular指令的compile,prelink 和 postlink以及controller

    一. 指令模板选项有complie和link两个字段,两者之间存在如下关系: 当compile字段存在时,link字段将被忽略,compile函数的返回值将作为link字段. 当compile不存在, ...

  7. git使用 从远程库克隆和更新到本地

    从远程库克隆到本地. git clone git@github.com:kingbook/Framework.git 或 git clone http://github.com/kingBook/Fr ...

  8. linux mce的一些相关内容和用户态监控的设计方法

    之所以想起写一点关于mce的东西,倒不是因为遇到mce的异常了,之前遇到过很多mce的异常,内存居多,但没有好好记录下来,写这个是因为参加2018 clk南京会议的一点想法. void __init ...

  9. webpack打包avalon+mmRouter

    这是上一篇<webpack打包avalon+oniui+jquery>的姐妹篇,avalon 的高级应用篇.大家要知道,现在最流行的网页架构就是SPA,SPA能提高用户体验.用户许多数据都 ...

  10. 18.struts-执行流程.md

    目录 1.流程 2.bean节点 3.package节点 result-type 拦截器 概念 拦截器和过滤器的异同: 问题:拦截器什么时候执行,action类和拦截器的执行顺序 4.常见问题 1.流 ...